diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 5e36c5c..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - env: { - es2021: true, - node: true, - }, - extends: 'eslint:recommended', - overrides: [], - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - }, - rules: { - indent: ['error', 2], - 'linebreak-style': ['error', 'unix'], - quotes: ['error', 'single'], - semi: ['error', 'always'], - }, -}; diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..fae4aca --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "env": { + "es2021": true, + "node": true + }, + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"], + "root": true, + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "linebreak-style": ["error", "unix"], + "semi": ["error", "always"], + "quotes": ["error", "single"] + } +} diff --git a/.gitignore b/.gitignore index cff455a..713c398 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules .env -!.env.sample \ No newline at end of file +!.env.sample +dist \ No newline at end of file diff --git a/README.md b/README.md index a4fda84..f6a2e3a 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Instead of entering a prompt, you can also use a number of commands to modify se - `.model`, `.temperature`, `.maxtokens`, `.historylength` or `.system` followed by a value will change a setting, or show it without a value - `.settings` shows all the current settings -- `.reset` resets settings to when you launched the current session +- `.reset` resets one or all settings to when you launched the current session - `.retry` reruns the last prompt with the latest settings - `.last` shows the last response again without running it through ChatGPT again (applies new word wrap/clipboard settings) - `.clear` clears the [conversation history](#controlling-conversation-context) @@ -92,6 +92,6 @@ When asked 'What are the benefits of a ChatGPT command line interface?', it whol ## Stack -Some of the libraries used: [clack](https://github.com/natemoo-re/clack/) for some of the prompt UI, [OpenAI Node.js library](https://github.com/openai/openai-node) to interact with the ChatGPT API, [node-clipboardy](https://www.npmjs.com/package/node-clipboardy) to copy responses to the system clipboard. +Some of the libraries used: [clack](https://github.com/natemoo-re/clack/) for some of the prompt UI, [OpenAI Node.js library](https://github.com/openai/openai-node) to interact with the ChatGPT API, [node-clipboardy](https://www.npmjs.com/package/node-clipboardy) to copy responses to the system clipboard, [zod](https://zod.dev/) for type safe validation [tsx](https://www.npmjs.com/package/tsx) for local TypeScript development. \- [Joost Schuur](https://joostschuur.com) ([@joostschuur](https://twitter.com/joostschuur)) diff --git a/package.json b/package.json index d54a8fb..1d80020 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,25 @@ { "name": "chatgpt-repl", - "version": "0.4.4", + "version": "0.4.6", "description": "CLI REPL interface to ChatGPT", "main": "src/cli.js", "type": "module", "bin": { - "chatgpt-repl": "src/cli.js" + "chatgpt-repl": "dist/cli.js" + }, + "scripts": { + "build": "tsc", + "dev": "tsc -w", + "clean": "rm -rf dist; rm -rf node_modules; pnpm install", + "lint": "tsc --noEmit", + "chatgpt-repl": "tsx src/cli.ts", + "prepublishOnly": "pnpm run lint && pnpm run clean && pnpm run build" }, - "scripts": {}, "author": "Joost Schuur ", "license": "ISC", "dependencies": { "@clack/prompts": "^0.6.3", + "axios": "^1.3.5", "boolean": "^3.2.0", "commander": "^10.0.0", "conf": "^11.0.1", @@ -27,11 +35,17 @@ "term-size": "^3.0.2", "update-notifier": "^6.0.2", "wordcount": "^1.1.1", - "wrap-text": "^1.0.9" + "wrap-text": "^1.0.9", + "zod": "^3.21.4" }, "publishConfig": { "access": "public" }, + "files": [ + "dist", + "package.json", + "screenshot.png" + ], "keywords": [ "chatgpt", "cli", @@ -48,6 +62,21 @@ "url": "https://github.com/jschuur/chatgpt-repl.git" }, "devDependencies": { - "eslint": "^8.35.0" + "@types/jsonfile": "^6.1.1", + "@types/md5": "^2.3.2", + "@types/node": "^18.15.3", + "@types/pluralize": "^0.0.29", + "@types/update-notifier": "^6.0.2", + "@types/wrap-text": "^1.0.0", + "@typescript-eslint/eslint-plugin": "^5.55.0", + "@typescript-eslint/parser": "^5.55.0", + "eslint": "^8.35.0", + "tsx": "^3.12.5", + "typescript": "^5.0.2" + }, + "cspell": { + "ignorePaths": [ + "pnpm-lock.yaml" + ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a82cf6e..16926ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,57 +1,109 @@ -lockfileVersion: 5.4 - -specifiers: - '@clack/prompts': ^0.6.3 - boolean: ^3.2.0 - commander: ^10.0.0 - conf: ^11.0.1 - dotenv: ^16.0.3 - eslint: ^8.35.0 - jsonfile: ^6.1.0 - md5: ^2.3.0 - minimist: ^1.2.8 - node-clipboardy: ^1.0.3 - openai: ^3.2.1 - picocolors: ^1.0.0 - pluralize: ^8.0.0 - pretty-ms: ^8.0.0 - term-size: ^3.0.2 - update-notifier: ^6.0.2 - wordcount: ^1.1.1 - wrap-text: ^1.0.9 +lockfileVersion: '6.0' dependencies: - '@clack/prompts': 0.6.3 - boolean: 3.2.0 - commander: 10.0.0 - conf: 11.0.1 - dotenv: 16.0.3 - jsonfile: 6.1.0 - md5: 2.3.0 - minimist: 1.2.8 - node-clipboardy: 1.0.3 - openai: 3.2.1 - picocolors: 1.0.0 - pluralize: 8.0.0 - pretty-ms: 8.0.0 - term-size: 3.0.2 - update-notifier: 6.0.2 - wordcount: 1.1.1 - wrap-text: 1.0.9 + '@clack/prompts': + specifier: ^0.6.3 + version: 0.6.3 + axios: + specifier: ^1.3.5 + version: 1.3.5 + boolean: + specifier: ^3.2.0 + version: 3.2.0 + commander: + specifier: ^10.0.0 + version: 10.0.0 + conf: + specifier: ^11.0.1 + version: 11.0.1 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + jsonfile: + specifier: ^6.1.0 + version: 6.1.0 + md5: + specifier: ^2.3.0 + version: 2.3.0 + minimist: + specifier: ^1.2.8 + version: 1.2.8 + node-clipboardy: + specifier: ^1.0.3 + version: 1.0.3 + openai: + specifier: ^3.2.1 + version: 3.2.1 + picocolors: + specifier: ^1.0.0 + version: 1.0.0 + pluralize: + specifier: ^8.0.0 + version: 8.0.0 + pretty-ms: + specifier: ^8.0.0 + version: 8.0.0 + term-size: + specifier: ^3.0.2 + version: 3.0.2 + update-notifier: + specifier: ^6.0.2 + version: 6.0.2 + wordcount: + specifier: ^1.1.1 + version: 1.1.1 + wrap-text: + specifier: ^1.0.9 + version: 1.0.9 + zod: + specifier: ^3.21.4 + version: 3.21.4 devDependencies: - eslint: 8.35.0 + '@types/jsonfile': + specifier: ^6.1.1 + version: 6.1.1 + '@types/md5': + specifier: ^2.3.2 + version: 2.3.2 + '@types/node': + specifier: ^18.15.3 + version: 18.15.3 + '@types/pluralize': + specifier: ^0.0.29 + version: 0.0.29 + '@types/update-notifier': + specifier: ^6.0.2 + version: 6.0.2 + '@types/wrap-text': + specifier: ^1.0.0 + version: 1.0.0 + '@typescript-eslint/eslint-plugin': + specifier: ^5.55.0 + version: 5.55.0(@typescript-eslint/parser@5.55.0)(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/parser': + specifier: ^5.55.0 + version: 5.55.0(eslint@8.35.0)(typescript@5.0.2) + eslint: + specifier: ^8.35.0 + version: 8.35.0 + tsx: + specifier: ^3.12.5 + version: 3.12.5 + typescript: + specifier: ^5.0.2 + version: 5.0.2 packages: - /@clack/core/0.3.2: + /@clack/core@0.3.2: resolution: {integrity: sha512-FZnsNynwGDIDktx6PEZK1EuCkFpY4ldEX6VYvfl0dqeoLPb9Jpw1xoUXaVcGR8ExmYNm1w2vdGdJkEUYD/2pqg==} dependencies: picocolors: 1.0.0 sisteransi: 1.0.5 dev: false - /@clack/prompts/0.6.3: + /@clack/prompts@0.6.3: resolution: {integrity: sha512-AM+kFmAHawpUQv2q9+mcB6jLKxXGjgu/r2EQjEwujgpCdzrST6BJqYw00GRn56/L/Izw5U7ImoLmy00X/r80Pw==} dependencies: '@clack/core': 0.3.2 @@ -61,7 +113,241 @@ packages: bundledDependencies: - is-unicode-supported - /@eslint/eslintrc/2.0.0: + /@esbuild-kit/cjs-loader@2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.4.0 + dev: true + + /@esbuild-kit/core-utils@3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + dependencies: + esbuild: 0.17.11 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.4.0 + dev: true + + /@esbuild/android-arm64@0.17.11: + resolution: {integrity: sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.11: + resolution: {integrity: sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.11: + resolution: {integrity: sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.11: + resolution: {integrity: sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.11: + resolution: {integrity: sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.11: + resolution: {integrity: sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.11: + resolution: {integrity: sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.11: + resolution: {integrity: sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.11: + resolution: {integrity: sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.11: + resolution: {integrity: sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.11: + resolution: {integrity: sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.11: + resolution: {integrity: sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.11: + resolution: {integrity: sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.11: + resolution: {integrity: sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.11: + resolution: {integrity: sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.11: + resolution: {integrity: sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.11: + resolution: {integrity: sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.11: + resolution: {integrity: sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.11: + resolution: {integrity: sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.11: + resolution: {integrity: sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.11: + resolution: {integrity: sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.11: + resolution: {integrity: sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.3.0(eslint@8.35.0): + resolution: {integrity: sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.35.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /@eslint-community/regexpp@4.4.0: + resolution: {integrity: sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.0.0: resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -78,12 +364,12 @@ packages: - supports-color dev: true - /@eslint/js/8.35.0: + /@eslint/js@8.35.0: resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array/0.11.8: + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: @@ -94,16 +380,16 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -111,12 +397,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -124,19 +410,19 @@ packages: fastq: 1.15.0 dev: true - /@pnpm/config.env-replace/1.0.0: + /@pnpm/config.env-replace@1.0.0: resolution: {integrity: sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==} engines: {node: '>=12.22.0'} dev: false - /@pnpm/network.ca-file/1.0.2: + /@pnpm/network.ca-file@1.0.2: resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} dependencies: graceful-fs: 4.2.10 dev: false - /@pnpm/npm-conf/2.1.0: + /@pnpm/npm-conf@2.1.0: resolution: {integrity: sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==} engines: {node: '>=12'} dependencies: @@ -145,23 +431,194 @@ packages: config-chain: 1.1.13 dev: false - /@sindresorhus/is/5.3.0: + /@sindresorhus/is@5.3.0: resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} engines: {node: '>=14.16'} dev: false - /@szmarczak/http-timer/5.0.1: + /@szmarczak/http-timer@5.0.1: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} dependencies: defer-to-connect: 2.0.1 dev: false - /@types/http-cache-semantics/4.0.1: + /@types/configstore@6.0.0: + resolution: {integrity: sha512-GUvNiia85zTDDIx0iPrtF3pI8dwrQkfuokEqxqPDE55qxH0U5SZz4awVZjiJLWN2ZZRkXCUqgsMUbygXY+kytA==} + dev: true + + /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: false - /acorn-jsx/5.3.2_acorn@8.8.2: + /@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/jsonfile@6.1.1: + resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} + dependencies: + '@types/node': 18.15.3 + dev: true + + /@types/md5@2.3.2: + resolution: {integrity: sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==} + dev: true + + /@types/node@18.15.3: + resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} + dev: true + + /@types/pluralize@0.0.29: + resolution: {integrity: sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==} + dev: true + + /@types/semver@7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@types/update-notifier@6.0.2: + resolution: {integrity: sha512-/OKZaYpzHqBO9D+IzqAB7VfC/fx+xl/CM1upD6D56QPNyvAsFULAVLfjlBIGCl1ibU1rKqZV45xOj018WqHhlA==} + dependencies: + '@types/configstore': 6.0.0 + boxen: 7.0.2 + dev: true + + /@types/wrap-text@1.0.0: + resolution: {integrity: sha512-VO2RICJdORdwgrvAXDNKtMZ0Za8dP28T9t1ZKug2KkVYS94zVqmSlcfw++6/VpO8tH45RaooTA2URrJyf/Jgjw==} + dev: true + + /@typescript-eslint/eslint-plugin@5.55.0(@typescript-eslint/parser@5.55.0)(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.4.0 + '@typescript-eslint/parser': 5.55.0(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 5.55.0 + '@typescript-eslint/type-utils': 5.55.0(eslint@8.35.0)(typescript@5.0.2) + '@typescript-eslint/utils': 5.55.0(eslint@8.35.0)(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.35.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.3.8 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.55.0(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.55.0 + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/typescript-estree': 5.55.0(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.35.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.55.0: + resolution: {integrity: sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/visitor-keys': 5.55.0 + dev: true + + /@typescript-eslint/type-utils@5.55.0(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.55.0(typescript@5.0.2) + '@typescript-eslint/utils': 5.55.0(eslint@8.35.0)(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.35.0 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.55.0: + resolution: {integrity: sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.55.0(typescript@5.0.2): + resolution: {integrity: sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/visitor-keys': 5.55.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.55.0(eslint@8.35.0)(typescript@5.0.2): + resolution: {integrity: sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.3.0(eslint@8.35.0) + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.55.0 + '@typescript-eslint/types': 5.55.0 + '@typescript-eslint/typescript-estree': 5.55.0(typescript@5.0.2) + eslint: 8.35.0 + eslint-scope: 5.1.1 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.55.0: + resolution: {integrity: sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.55.0 + eslint-visitor-keys: 3.3.0 + dev: true + + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -169,13 +626,13 @@ packages: acorn: 8.8.2 dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /ajv-formats/2.1.1_ajv@8.12.0: + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: ajv: ^8.0.0 @@ -186,7 +643,7 @@ packages: ajv: 8.12.0 dev: false - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -195,7 +652,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.12.0: + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -204,53 +661,55 @@ packages: uri-js: 4.4.1 dev: false - /ansi-align/3.0.1: + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: string-width: 4.2.3 - dev: false - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: false - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: false - /arch/2.2.0: + /arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: false - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /asynckit/0.4.0: + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /atomically/2.0.1: + /atomically@2.0.1: resolution: {integrity: sha512-sxBhVZUFBFhqSAsYMM3X2oaUi2NVDJ8U026FsIusM8gYXls9AYs/eXzgGrufs1Qjpkxi9zunds+75QUFz+m7UQ==} dependencies: stubborn-fs: 1.2.4 when-exit: 2.1.0 dev: false - /axios/0.26.1: + /axios@0.26.1: resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} dependencies: follow-redirects: 1.15.2 @@ -258,15 +717,25 @@ packages: - debug dev: false - /balanced-match/1.0.2: + /axios@1.3.5: + resolution: {integrity: sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /boolean/3.2.0: + /boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} dev: false - /boxen/7.0.2: + /boxen@7.0.2: resolution: {integrity: sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==} engines: {node: '>=14.16'} dependencies: @@ -278,21 +747,31 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: false - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /cacheable-lookup/7.0.0: + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} dev: false - /cacheable-request/10.2.8: + /cacheable-request@10.2.8: resolution: {integrity: sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==} engines: {node: '>=14.16'} dependencies: @@ -305,17 +784,16 @@ packages: responselike: 3.0.0 dev: false - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camelcase/7.0.1: + /camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - dev: false - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -323,58 +801,56 @@ packages: supports-color: 7.2.0 dev: true - /chalk/5.2.0: + /chalk@5.2.0: resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - /charenc/0.0.2: + /charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} dev: false - /ci-info/3.8.0: + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} dev: false - /cli-boxes/3.0.0: + /cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - dev: false - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: false - /commander/10.0.0: + /commander@10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /conf/11.0.1: + /conf@11.0.1: resolution: {integrity: sha512-WlLiQboEjKx0bYx2IIRGedBgNjLAxtwPaCSnsjWPST5xR0DB4q8lcsO/bEH9ZRYNcj63Y9vj/JG/5Fg6uWzI0Q==} engines: {node: '>=14.16'} dependencies: ajv: 8.12.0 - ajv-formats: 2.1.1_ajv@8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) atomically: 2.0.1 debounce-fn: 5.1.2 dot-prop: 7.2.0 @@ -383,14 +859,14 @@ packages: semver: 7.3.8 dev: false - /config-chain/1.1.13: + /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: ini: 1.3.8 proto-list: 1.2.4 dev: false - /configstore/6.0.0: + /configstore@6.0.0: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} engines: {node: '>=12'} dependencies: @@ -401,7 +877,7 @@ packages: xdg-basedir: 5.1.0 dev: false - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -409,25 +885,25 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /crypt/0.0.2: + /crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: false - /crypto-random-string/4.0.0: + /crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} dependencies: type-fest: 1.4.0 dev: false - /debounce-fn/5.1.2: + /debounce-fn@5.1.2: resolution: {integrity: sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==} engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: false - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -439,86 +915,128 @@ packages: ms: 2.1.2 dev: true - /decompress-response/6.0.0: + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 dev: false - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: false - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /defer-to-connect/2.0.1: + /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} dev: false - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: false - /doctrine/3.0.0: + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /dot-prop/6.0.1: + /dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} dependencies: is-obj: 2.0.0 dev: false - /dot-prop/7.2.0: + /dot-prop@7.2.0: resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: type-fest: 2.19.0 dev: false - /dotenv/16.0.3: + /dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} dev: false - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false - /env-paths/3.0.0: + /env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /escape-goat/4.0.0: + /esbuild@0.17.11: + resolution: {integrity: sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.11 + '@esbuild/android-arm64': 0.17.11 + '@esbuild/android-x64': 0.17.11 + '@esbuild/darwin-arm64': 0.17.11 + '@esbuild/darwin-x64': 0.17.11 + '@esbuild/freebsd-arm64': 0.17.11 + '@esbuild/freebsd-x64': 0.17.11 + '@esbuild/linux-arm': 0.17.11 + '@esbuild/linux-arm64': 0.17.11 + '@esbuild/linux-ia32': 0.17.11 + '@esbuild/linux-loong64': 0.17.11 + '@esbuild/linux-mips64el': 0.17.11 + '@esbuild/linux-ppc64': 0.17.11 + '@esbuild/linux-riscv64': 0.17.11 + '@esbuild/linux-s390x': 0.17.11 + '@esbuild/linux-x64': 0.17.11 + '@esbuild/netbsd-x64': 0.17.11 + '@esbuild/openbsd-x64': 0.17.11 + '@esbuild/sunos-x64': 0.17.11 + '@esbuild/win32-arm64': 0.17.11 + '@esbuild/win32-ia32': 0.17.11 + '@esbuild/win32-x64': 0.17.11 + dev: true + + /escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} dev: false - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /eslint-scope/7.1.1: + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -526,7 +1044,7 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.35.0: + /eslint-utils@3.0.0(eslint@8.35.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -536,17 +1054,17 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.35.0: + /eslint@8.35.0: resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -563,7 +1081,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.35.0 + eslint-utils: 3.0.0(eslint@8.35.0) eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.5.0 @@ -595,40 +1113,45 @@ packages: - supports-color dev: true - /espree/9.4.1: + /espree@9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.3.0 dev: true - /esquery/1.5.0: + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/5.3.0: + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -643,31 +1166,49 @@ packages: strip-final-newline: 2.0.0 dev: false - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-json-stable-stringify/2.1.0: + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /find-up/5.0.0: + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -675,7 +1216,7 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -683,11 +1224,11 @@ packages: rimraf: 3.0.2 dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /follow-redirects/1.15.2: + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -697,12 +1238,12 @@ packages: optional: true dev: false - /form-data-encoder/2.1.4: + /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} dev: false - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -711,23 +1252,42 @@ packages: mime-types: 2.1.35 dev: false - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /get-stream/6.0.1: + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: false - /glob-parent/6.0.2: + /get-tsconfig@4.4.0: + resolution: {integrity: sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -738,21 +1298,33 @@ packages: path-is-absolute: 1.0.1 dev: true - /global-dirs/3.0.1: + /global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} dependencies: ini: 2.0.0 dev: false - /globals/13.20.0: + /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /got/12.6.0: + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /got@12.6.0: resolution: {integrity: sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==} engines: {node: '>=14.16'} dependencies: @@ -769,29 +1341,29 @@ packages: responselike: 3.0.0 dev: false - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: false - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has-yarn/3.0.0: + /has-yarn@3.0.0: resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /http-cache-semantics/4.1.1: + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false - /http2-wrapper/2.2.0: + /http2-wrapper@2.2.0: resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} engines: {node: '>=10.19.0'} dependencies: @@ -799,17 +1371,17 @@ packages: resolve-alpn: 1.2.1 dev: false - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: false - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -817,70 +1389,69 @@ packages: resolve-from: 4.0.0 dev: true - /import-lazy/4.0.0: + /import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} dev: false - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - /ini/2.0.0: + /ini@2.0.0: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} engines: {node: '>=10'} dev: false - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false - /is-ci/3.0.1: + /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.8.0 dev: false - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: false - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-installed-globally/0.4.0: + /is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} dependencies: @@ -888,76 +1459,81 @@ packages: is-path-inside: 3.0.3 dev: false - /is-npm/6.0.0: + /is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /is-obj/2.0.0: + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} dev: false - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: false - /is-typedarray/1.0.0: + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: false - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: false - /is-yarn-global/0.4.1: + /is-yarn-global@0.4.1: resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} engines: {node: '>=12'} dev: false - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /js-sdsl/4.3.0: + /js-sdsl@4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 dev: true - /json-buffer/3.0.1: + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: false - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: false - /json-schema-typed/8.0.1: + /json-schema-typed@8.0.1: resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} dev: false - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -965,20 +1541,20 @@ packages: graceful-fs: 4.2.10 dev: false - /keyv/4.5.2: + /keyv@4.5.2: resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} dependencies: json-buffer: 3.0.1 dev: false - /latest-version/7.0.0: + /latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} dependencies: package-json: 8.1.0 dev: false - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -986,37 +1562,36 @@ packages: type-check: 0.4.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lowercase-keys/3.0.0: + /lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: false - /match-words/0.1.1: + /match-words@0.1.1: resolution: {integrity: sha512-cywKmeeoNFi//GGLHZ+Zb/M3ZX0VTwJjotLMWhDZoBRtSbw3kraIuIxw7P/xy+t5NSAMHNVeljM63WRBYQ563w==} engines: {node: '>=0.10.0'} dependencies: word-regex: 0.1.2 dev: false - /md5/2.3.0: + /md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: charenc: 0.0.2 @@ -1024,61 +1599,78 @@ packages: is-buffer: 1.1.6 dev: false - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: false - /mime-db/1.52.0: + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: false - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: false - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: false - /mimic-fn/4.0.0: + /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} dev: false - /mimic-response/3.1.0: + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} dev: false - /mimic-response/4.0.0: + /mimic-response@4.0.0: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /natural-compare/1.4.0: + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-clipboardy/1.0.3: + /node-clipboardy@1.0.3: resolution: {integrity: sha512-/ErAFOtWDNhZh38rrwlAo05Soxbht/rgWugLOt2Ds+NDpZ+2sPiGiwOmFWzV+65fUYjwi+EJfHByIJ4waTHbVg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -1087,32 +1679,32 @@ packages: is-wsl: 2.2.0 dev: false - /normalize-url/8.0.0: + /normalize-url@8.0.0: resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} engines: {node: '>=14.16'} dev: false - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: false - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: false - /openai/3.2.1: + /openai@3.2.1: resolution: {integrity: sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==} dependencies: axios: 0.26.1 @@ -1121,7 +1713,7 @@ packages: - debug dev: false - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -1133,26 +1725,26 @@ packages: word-wrap: 1.2.3 dev: true - /p-cancelable/3.0.0: + /p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} dev: false - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /package-json/8.1.0: + /package-json@8.1.0: resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} engines: {node: '>=14.16'} dependencies: @@ -1162,78 +1754,92 @@ packages: semver: 7.3.8 dev: false - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-ms/3.0.0: + /parse-ms@3.0.0: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} dev: false - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /picocolors/1.0.0: + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: false - /pluralize/8.0.0: + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} dev: false - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /pretty-ms/8.0.0: + /pretty-ms@8.0.0: resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} engines: {node: '>=14.16'} dependencies: parse-ms: 3.0.0 dev: false - /proto-list/1.2.4: + /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: false - /punycode/2.3.0: + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - /pupa/3.1.0: + /pupa@3.1.0: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} dependencies: escape-goat: 4.0.0 dev: false - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-lru/5.1.1: + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} dev: false - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -1243,204 +1849,254 @@ packages: strip-json-comments: 2.0.1 dev: false - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /registry-auth-token/5.0.2: + /registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} engines: {node: '>=14'} dependencies: '@pnpm/npm-conf': 2.1.0 dev: false - /registry-url/6.0.1: + /registry-url@6.0.1: resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} engines: {node: '>=12'} dependencies: rc: 1.2.8 dev: false - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: false - /resolve-alpn/1.2.1: + /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: false - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /responselike/3.0.0: + /responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} dependencies: lowercase-keys: 3.0.0 dev: false - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /semver-diff/4.0.0: + /semver-diff@4.0.0: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} engines: {node: '>=12'} dependencies: semver: 7.3.8 dev: false - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - dev: false - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false - /string-width/4.2.3: + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: false - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.0.1 - dev: false - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: false - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: false - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: false - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /stubborn-fs/1.2.4: + /stubborn-fs@1.2.4: resolution: {integrity: sha512-KRa4nIRJ8q6uApQbPwYZVhOof8979fw4xbajBWa5kPJFa4nyY3aFaMWVyIVCDnkNCCG/3HLipUZ4QaNlYsmX1w==} dev: false - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /term-size/3.0.2: + /term-size@3.0.2: resolution: {integrity: sha512-YfE8KwjrumviCxmeOS1r1hAwqUcd/AnhrG/Pol/Gry91EyUCS+jQH0qFUZOUkpGQ5rXsKMK6S6kjne53ytYS/w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /type-check/0.4.0: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tsutils@3.21.0(typescript@5.0.2): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + 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' + dependencies: + tslib: 1.14.1 + typescript: 5.0.2 + dev: true + + /tsx@3.12.5: + resolution: {integrity: sha512-/TLj30xF1zcN9JkoFCyROtIQUi8cRQG+AFchsg5YkWou3+RXxTZS/ffWB3nCxyZPoBqF2+8ohs07N815dNb1wQ==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/1.4.0: + /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} dev: false - /type-fest/2.19.0: + /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - dev: false - /typedarray-to-buffer/3.1.5: + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 dev: false - /unique-string/3.0.0: + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /unique-string@3.0.0: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} dependencies: crypto-random-string: 4.0.0 dev: false - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: false - /update-notifier/6.0.2: + /update-notifier@6.0.2: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} engines: {node: '>=14.16'} dependencies: @@ -1460,64 +2116,62 @@ packages: xdg-basedir: 5.1.0 dev: false - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - /when-exit/2.1.0: + /when-exit@2.1.0: resolution: {integrity: sha512-H85ulNwUBU1e6PGxkWUDgxnbohSXD++ah6Xw1VHAN7CtypcbZaC4aYjQ+C2PMVaDkURDuOinNAT+Lnz3utWXxQ==} dev: false - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 - /widest-line/4.0.1: + /widest-line@4.0.1: resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} engines: {node: '>=12'} dependencies: string-width: 5.1.2 - dev: false - /word-regex/0.1.2: + /word-regex@0.1.2: resolution: {integrity: sha512-4jK/OibPeindR9o/sryObhVWNgD2LJCMJFWEME69p48sEYpE9axfyjHK+RqYcOeoEoqcqJEPE9iMdiiFpXHo0Q==} engines: {node: '>=0.10.0'} dev: false - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordcount/1.1.1: + /wordcount@1.1.1: resolution: {integrity: sha512-3PzTv5i9Zq+DYjYFs9mybWjz3uxd19pzZEhroS0C/424IxrxWeqd+0Qt/R+UjydSWutYjaQSTklO9EBZ6YsiWg==} engines: {node: '>=0.10.0'} dependencies: match-words: 0.1.1 dev: false - /wrap-ansi/8.1.0: + /wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.0.1 - dev: false - /wrap-text/1.0.9: + /wrap-text@1.0.9: resolution: {integrity: sha512-NWfjspSgMDXQIMpKM56AwCQPI01OMFRYYJBh6dGNCfH7AOl+j/VqqbiopgJ4VuQfSluqLc+2ekqaPNpYAGZ/Vg==} dev: false - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /write-file-atomic/3.0.3: + /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 @@ -1526,16 +2180,19 @@ packages: typedarray-to-buffer: 3.1.5 dev: false - /xdg-basedir/5.1.0: + /xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} dev: false - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false diff --git a/src/cli.js b/src/cli.ts similarity index 78% rename from src/cli.js rename to src/cli.ts index e9fd461..d9a1009 100755 --- a/src/cli.js +++ b/src/cli.ts @@ -7,6 +7,7 @@ import updateNotifier from 'update-notifier'; import { chatLoop } from './loop.js'; import { apiKeyCheck } from './openai.js'; import { packageJson } from './settings.js'; +import { getErrorMessage } from './utils.js'; (async () => { try { @@ -16,7 +17,7 @@ import { packageJson } from './settings.js'; chatLoop(); } catch (error) { - console.error(`${pc.red('Error')}: ${error.message}`); + console.error(`${pc.red('Error')}: ${getErrorMessage(error)}`); process.exit(1); } diff --git a/src/commands.js b/src/commands.js deleted file mode 100644 index f7d963b..0000000 --- a/src/commands.js +++ /dev/null @@ -1,112 +0,0 @@ -import clipboard from 'node-clipboardy'; -import pc from 'picocolors'; -import pluralize from 'pluralize'; -import wordcount from 'wordcount'; - -import { showLastResponse } from './loop.js'; -import { apiKey, clearConversation, conversation, updateConversation } from './openai.js'; -import { - indentPadding, - packageJson, - resetSettings, - settingsSummary, - updateSetting, -} from './settings.js'; -import { formatTotalUsage } from './usage.js'; -import { clearLine } from './utils.js'; - -export const COMMAND_PREFIX = '.'; - -function retryCmd() { - if (conversation.length < 3) console.warn('No previous response to retry.'); - else return conversation[conversation.length - 2]?.content; -} - -function copyLastResultCmd() { - const lastMessage = conversation[conversation.length - 1]; - const wordCount = wordcount(lastMessage?.content || ''); - const characterCount = (lastMessage?.content || '').length; - - if (conversation.length < 3) console.warn('No previous response to copy.'); - else if (lastMessage?.role === 'assistant') { - clipboard.writeSync(lastMessage.content); - - console.log( - `Last response (${pluralize('word', wordCount, true)}, ${pluralize( - 'character', - characterCount, - true - )}) copied to clipboard.` - ); - } else { - console.error(`${pc.red('Error')}: Unable to copy last response copied to clipboard.`); - } -} - -function showHelp() { - console.log(`\n${pc.green('Available commands')}:\n`); - for (const [command, [description]] of Object.entries(commandList)) { - console.log(` ${COMMAND_PREFIX}${command.padEnd(indentPadding)} ${pc.dim(description)}`); - } - - console.log(); -} - -function usageCmd() { - console.log(`\n${pc.green(`Usage for current API Key (...${pc.dim(apiKey.slice(-6))}):`)}\n`); - console.log(formatTotalUsage()); - console.log(); -} - -export function exitCmd() { - const totalUsage = formatTotalUsage(); - - clearLine(); - console.log('See you next time! 🤖\n'); - console.log(totalUsage); - - process.exit(0); -} - -export function runCommand(cmd) { - const [command, ...args] = cmd.slice(1).split(' '); - - if (!commandList[command]) - console.error( - `Unknown command: ${COMMAND_PREFIX}${command}. List commands with ${COMMAND_PREFIX}help.` - ); - else return commandList[command][1](args.join(' ')); -} - -export const commandList = { - help: ['Show help', showHelp], - version: ['Show version', () => console.log(packageJson.version)], - settings: ['Show current settings', settingsSummary], - usage: ['Show usage for current API key', usageCmd], - model: ['Show/update model', (str) => updateSetting('model', str, 'model')], - temperature: ['Show/update temperature', (str) => updateSetting('temperature', str, 'float')], - maxtokens: [ - 'Show/update max tokens per prompt', - (str) => updateSetting('maxTokens', str, 'integer'), - 'integer', - ], - historylength: [ - 'Show/update history length', - (str) => updateSetting('historyLength', str, 'integer'), - ], - system: [ - 'Show/update system text', - (str) => updateConversation({ role: 'system', content: str }), - ], - reset: ['Reset settings', resetSettings], - retry: ['Send previous prompt again', retryCmd], - clear: ['Clear conversation history', clearConversation], - clipboard: [ - 'Modify automatic clipboard copying', - (str) => updateSetting('clipboard', str, 'boolean'), - ], - copy: ['Copy last result to clipboard', copyLastResultCmd], - wordwrap: ['Modify response word wrapping', (str) => updateSetting('wordWrap', str, 'boolean')], - last: ['Show the last response again', showLastResponse], - exit: ['Exit chatgpt-repl', exitCmd], -}; diff --git a/src/commands/commands.ts b/src/commands/commands.ts new file mode 100644 index 0000000..30f80c1 --- /dev/null +++ b/src/commands/commands.ts @@ -0,0 +1,73 @@ +import { clearConversation, updateConversation } from '../conversation.js'; +import { showLastResponse } from '../loop.js'; +import { packageJson, resetSettings, updateSetting } from '../settings.js'; + +import copyCmd from './copyCmd.js'; +import exitCmd from './exitCmd.js'; +import helpCmd from './helpCmd.js'; +import retryCmd from './retryCmd.js'; +import settingsCmd from './settingsCmd.js'; +import usageCmd from './usageCmd.js'; + +export const COMMAND_PREFIX = '.'; + +type CommandDefinition = [description: string, commandFunction: (args: string) => string | void]; +interface CommandList { + [key: string]: CommandDefinition; +} + +export function runCommand(cmd: string): string | void { + const [command, ...args] = cmd.slice(1).split(' '); + + if (!commandList[command]) + console.error( + `Unknown command: ${COMMAND_PREFIX}${command}. List commands with ${COMMAND_PREFIX}help.` + ); + else { + const cmdFunc = commandList[command][1]; + + if (cmdFunc) return cmdFunc(args.join(' ')); + else console.error(`command: ${COMMAND_PREFIX}${command} is missing a function to execute.`); + } + + return ''; +} + +export const commandList: CommandList = { + help: ['Show help', helpCmd], + version: ['Show version', () => console.log(packageJson.version)], + + settings: ['Show current settings', settingsCmd], + usage: ['Show usage for current API key', usageCmd], + model: ['Show/update model', (value: string) => updateSetting('model', value.trim())], + temperature: [ + 'Show/update temperature', + (value: string) => updateSetting('temperature', value.trim()), + ], + maxtokens: [ + 'Show/update max tokens per prompt', + (value: string) => updateSetting('maxTokens', value.trim()), + ], + historylength: [ + 'Show/update history length', + (value: string) => updateSetting('historyLength', value.trim()), + ], + system: [ + 'Show/update system text', + (value: string) => updateConversation({ role: 'system', content: value.trim() }), + ], + reset: ['Reset one or all settings', (setting: string) => resetSettings(setting.trim())], + retry: ['Send previous prompt again', retryCmd], + clear: ['Clear conversation history', () => clearConversation()], + clipboard: [ + 'Modify automatic clipboard copying', + (value: string) => updateSetting('clipboard', value.trim()), + ], + copy: ['Copy last result to clipboard', copyCmd], + wordwrap: [ + 'Modify response word wrapping', + (value: string) => updateSetting('wordWrap', value.trim()), + ], + last: ['Show the last response again', showLastResponse], + exit: ['Exit chatgpt-repl', exitCmd], +}; diff --git a/src/commands/copyCmd.ts b/src/commands/copyCmd.ts new file mode 100644 index 0000000..8b62f84 --- /dev/null +++ b/src/commands/copyCmd.ts @@ -0,0 +1,27 @@ +import clipboard from 'node-clipboardy'; +import pc from 'picocolors'; +import pluralize from 'pluralize'; +import wordcount from 'wordcount'; + +import { conversation } from '../conversation.js'; + +export default function copyLastResultCmd() { + const lastMessage = conversation[conversation.length - 1]; + const wordCount = wordcount(lastMessage?.content || ''); + const characterCount = (lastMessage?.content || '').length; + + if (conversation.length < 3) console.warn('No previous response to copy.'); + else if (lastMessage?.role === 'assistant') { + clipboard.writeSync(lastMessage.content); + + console.log( + `Last response (${pluralize('word', wordCount, true)}, ${pluralize( + 'character', + characterCount, + true + )}) copied to clipboard.` + ); + } else { + console.error(`${pc.red('Error')}: Unable to copy last response copied to clipboard.`); + } +} diff --git a/src/commands/exitCmd.ts b/src/commands/exitCmd.ts new file mode 100644 index 0000000..13343ab --- /dev/null +++ b/src/commands/exitCmd.ts @@ -0,0 +1,12 @@ +import { formatTotalUsage } from '../usage.js'; +import { clearLine } from '../utils.js'; + +export default function exitCmd() { + const totalUsage = formatTotalUsage(); + + clearLine(); + console.log('See you next time! 🤖\n'); + console.log(totalUsage); + + process.exit(0); +} diff --git a/src/commands/helpCmd.ts b/src/commands/helpCmd.ts new file mode 100644 index 0000000..808079b --- /dev/null +++ b/src/commands/helpCmd.ts @@ -0,0 +1,13 @@ +import pc from 'picocolors'; + +import { indentPadding } from '../settings.js'; +import { COMMAND_PREFIX, commandList } from './commands.js'; + +export default function helpCmd() { + console.log(`\n${pc.green('Available commands')}:\n`); + for (const [command, [description]] of Object.entries(commandList)) { + console.log(` ${COMMAND_PREFIX}${command.padEnd(indentPadding)} ${pc.dim(description)}`); + } + + console.log(); +} diff --git a/src/commands/retryCmd.ts b/src/commands/retryCmd.ts new file mode 100644 index 0000000..6d7908f --- /dev/null +++ b/src/commands/retryCmd.ts @@ -0,0 +1,6 @@ +import { conversation } from '../conversation.js'; + +export default function retryCmd() { + if (conversation.length < 3) console.warn('No previous response to retry.'); + else return conversation[conversation.length - 2]?.content; +} diff --git a/src/commands/settingsCmd.ts b/src/commands/settingsCmd.ts new file mode 100644 index 0000000..6b02d4c --- /dev/null +++ b/src/commands/settingsCmd.ts @@ -0,0 +1,12 @@ +import pc from 'picocolors'; + +import { indentPadding, settings } from '../settings.js'; + +export default function settingsCmd(str: string) { + console.log(`\n${pc.green(str || 'Current settings:')}\n`); + + for (const [key, value] of Object.entries(settings)) + console.log(` ${key.toLowerCase().padEnd(indentPadding + 1)} ${pc.dim(String(value))}`); + + console.log(); +} diff --git a/src/commands/usageCmd.ts b/src/commands/usageCmd.ts new file mode 100644 index 0000000..98cd65a --- /dev/null +++ b/src/commands/usageCmd.ts @@ -0,0 +1,12 @@ +import pc from 'picocolors'; + +import { apiKey } from '../openai.js'; +import { formatTotalUsage } from '../usage.js'; + +export default function usageCmd() { + console.log( + `\n${pc.green(`Usage for current API Key (...${pc.dim((apiKey || '').slice(-6))}):`)}\n` + ); + console.log(formatTotalUsage()); + console.log(); +} diff --git a/src/conversation.ts b/src/conversation.ts new file mode 100644 index 0000000..d536f08 --- /dev/null +++ b/src/conversation.ts @@ -0,0 +1,33 @@ +import { settings, updateSetting } from './settings.js'; + +type ConversationRole = 'system' | 'user' | 'assistant'; + +type Conversation = { + role: ConversationRole; + content: string; +}[]; + +export let conversation: Conversation = [{ role: 'system', content: settings.system }]; + +export function updateConversation({ role, content }: { role: ConversationRole; content: string }) { + const { historyLength } = settings; + + if (role === 'system') { + updateSetting('system', content); + clearConversation(false); + } else { + conversation.push({ role, content }); + + if (role === 'assistant') + conversation = + historyLength <= 0 + ? [conversation[0]] + : [conversation[0], ...conversation.slice(1).slice(-(2 * historyLength))]; + } +} + +export function clearConversation(announce = true) { + conversation = [{ role: 'system', content: settings.system }]; + + if (announce) console.log('Current conversation history cleared.'); +} diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..123f120 --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,16 @@ +declare module 'wordcount'; +declare module 'node-clipboardy'; +declare module 'picocolors'; + +declare namespace NodeJS { + export interface ProcessEnv { + NODE_ENV: string; + OPENAI_API_KEY: string; + OPENAI_USD_PRICE_PER_TOKEN: number; + OPENAI_MAX_TOKENS: number; + OPENAI_HISTORY_LENGTH: number; + OPENAI_TEMPERATURE: number; + OPENAI_MODEL: string; + OPENAI_SYSTEM: string; + } +} diff --git a/src/loop.js b/src/loop.ts similarity index 67% rename from src/loop.js rename to src/loop.ts index 433b99f..368d453 100644 --- a/src/loop.js +++ b/src/loop.ts @@ -5,29 +5,33 @@ import pc from 'picocolors'; import prettyMilliseconds from 'pretty-ms'; import terminalSize from 'term-size'; -import { conf, packageJson, settings } from './settings.js'; +import { packageJson, settings } from './settings.js'; -import { commandList, COMMAND_PREFIX, exitCmd, runCommand } from './commands.js'; -import { askChatGPT, conversation } from './openai.js'; +import { COMMAND_PREFIX, commandList, runCommand } from './commands/commands.js'; +import exitCmd from './commands/exitCmd.js'; + +import { conversation } from './conversation.js'; +import { askChatGPT, handleError } from './openai.js'; import { formatUsage } from './usage.js'; import { clearLine, errorMsg, wrap } from './utils.js'; -const promptText = pc.green('You: '); +const promptText: string = pc.green('You: '); -let rl; +let rl: readline.Interface; function initReadline() { rl = readline .createInterface({ input: process.stdin, output: process.stdout, - completer: (line) => { - const cmd = line?.split(' ')?.[0]; + completer: (line: string) => { + const input = line.trim(); + const cmd = input.split(' ')?.[0]; const commands = Object.keys(commandList).map((c) => `${COMMAND_PREFIX}${c}`); - if (!cmd || !line.startsWith(COMMAND_PREFIX) || commands.includes(cmd)) return [[], line]; + if (!cmd || !input.startsWith(COMMAND_PREFIX) || commands.includes(cmd)) return [[], input]; - const hits = commands.filter((c) => c.startsWith(line)); + const hits = commands.filter((c) => c.startsWith(input)); return [hits.length ? hits.map((c) => `${c} `) : commands, cmd]; }, @@ -35,7 +39,7 @@ function initReadline() { .on('close', exitCmd); } -function showFinishReason(finishReason) { +function showFinishReason(finishReason: string | undefined) { if (!finishReason || finishReason === 'stop') return; if (finishReason === 'length') @@ -56,27 +60,20 @@ export function showLastResponse() { ? wrap(`${pc.cyan('ChatGPT')}: ${answer}`, columns - 5) : answer; - console.log(`\n${answerFormatted}`); + console.log(`\n${answerFormatted}\n`); if (settings.clipboard) clipboard.writeSync(answer); } -function handleError(error) { - const { response, message } = error; - - if (response) { - if (response?.status === 401) { - conf.delete('apiKey'); - errorMsg('Invalid API key. Please restart and enter a new one.'); - - process.exit(1); - } else errorMsg(`${response?.status}: ${response?.statusText} ${pc.dim(`(${message})`)}\n`); - } else if (message) { - errorMsg(`${message}\n`); - } -} - -function responseHeader({ response, startTime }) { +function responseHeader({ + response, + startTime, +}: { + response: any; + // TODO: refactor to remove any + // response: AxiosResponse; + startTime: number; +}) { const usage = formatUsage(response); return pc.dim( @@ -86,7 +83,7 @@ function responseHeader({ response, startTime }) { ); } -async function inputPrompt() { +async function inputPrompt(): Promise { return new Promise((resolve) => { rl.question(promptText, resolve); }); @@ -103,17 +100,16 @@ export async function chatLoop() { // eslint-disable-next-line no-constant-condition while (true) { - let input = await inputPrompt(); - - if (input.startsWith(COMMAND_PREFIX)) input = runCommand(input); + const input = (await inputPrompt())?.trim(); + const prompt = input.startsWith(COMMAND_PREFIX) ? runCommand(input) : input; - if (input) { + if (prompt) { const startTime = Date.now(); process.stdout.write(`\n${pc.cyan('ChatGPT')}: Thinking...`); try { - const { answer, finishReason, response } = await askChatGPT(input); + const { answer, finishReason, response } = await askChatGPT(prompt); clearLine(); console.log(responseHeader({ response, startTime })); diff --git a/src/openai.js b/src/openai.ts similarity index 53% rename from src/openai.js rename to src/openai.ts index 2776574..17b7ab7 100644 --- a/src/openai.js +++ b/src/openai.ts @@ -1,16 +1,40 @@ import { confirm, intro, isCancel, outro, text } from '@clack/prompts'; -import { Configuration, OpenAIApi } from 'openai'; +import { isAxiosError } from 'axios'; +import { Configuration, CreateChatCompletionRequest, OpenAIApi } from 'openai'; import pc from 'picocolors'; -import { conf, settings, updateSetting } from './settings.js'; +import { conversation, updateConversation } from './conversation.js'; +import { conf, settings } from './settings.js'; import { addUsage } from './usage.js'; +import { errorMsg, getErrorMessage } from './utils.js'; + +let openai: OpenAIApi; + +export let apiKey = ''; + +export function handleError(error: unknown) { + if (error) { + if (isAxiosError(error)) { + const { response } = error; + + if (response) { + if (response?.status === 401) { + conf.delete('apiKey'); + errorMsg('Invalid API key. Please restart and enter a new one.'); + + process.exit(1); + } else + errorMsg( + `${response?.status}: ${response?.statusText} ${pc.dim( + `(${getErrorMessage(error)})` + )}\n` + ); + } + } + } else errorMsg(`${getErrorMessage(error)}\n`); +} -let openai; - -export let apiKey; -export let conversation = [{ role: 'system', content: settings.system }]; - -function initOpenAI(key) { +function initOpenAI(key: string) { apiKey = key; const configuration = new Configuration({ apiKey }); @@ -36,26 +60,22 @@ async function inputApiKey() { return key; } -async function validateApiKey(key) { +async function validateApiKey(key: string) { try { initOpenAI(key); await openai.listModels(); - } catch ({ response }) { - if (response?.status === 401) { - console.error(`${pc.red('Error')}: Invalid API key. Please restart and use a different one.`); - - process.exit(1); - } + } catch (error) { + handleError(error); } } export async function apiKeyCheck() { - let key = conf.get('apiKey'); + let key = String(conf.get('apiKey', settings.apiKey)); // validate keys not previously used/saved (options override saved key) - if (!key || settings.apiKey) { - key = settings.apiKey || (await inputApiKey()); + if (!key) { + key = await inputApiKey(); await validateApiKey(key); // don't overwrite a saved key when commander set settings.apiKey via.env() @@ -65,30 +85,7 @@ export async function apiKeyCheck() { if (!openai) initOpenAI(key); } -export function updateConversation({ role, content }) { - const { historyLength } = settings; - - if (role === 'system') { - updateSetting('system', content); - clearConversation(false); - } else { - conversation.push({ role, content }); - - if (role === 'assistant') - conversation = - historyLength <= 0 - ? [conversation[0]] - : [conversation[0], ...conversation.slice(1).slice(-(2 * historyLength))]; - } -} - -export function clearConversation(announce = true) { - conversation = [{ role: 'system', content: settings.system }]; - - if (announce) console.log('Current conversation history cleared.'); -} - -export async function askChatGPT(question) { +export async function askChatGPT(question: string) { const { model, temperature, maxTokens } = settings; updateConversation({ role: 'user', content: question }); @@ -98,16 +95,14 @@ export async function askChatGPT(question) { messages: conversation, temperature, max_tokens: maxTokens, - }; + } as CreateChatCompletionRequest; const response = await openai.createChatCompletion(params); addUsage(response?.data?.usage?.total_tokens); - const { - message: { content: answer }, - finish_reason: finishReason, - } = response?.data?.choices?.[0] || {}; + const { message: { content: answer = undefined } = {}, finish_reason: finishReason } = + response?.data?.choices?.[0] || {}; if (answer) updateConversation({ role: 'assistant', content: answer }); return { answer, finishReason, response }; diff --git a/src/settings.js b/src/settings.js deleted file mode 100644 index 967fad1..0000000 --- a/src/settings.js +++ /dev/null @@ -1,133 +0,0 @@ -import path from 'path'; -import url from 'url'; - -import { Command, Option } from 'commander'; -import Conf from 'conf'; -import jsonfile from 'jsonfile'; -import pc from 'picocolors'; - -import { - KNOWN_MODELS, - validateBooleanOption, - validateFloatOption, - validateIntOption, - validateModel, -} from './validate.js'; - -const resolvePath = (p) => path.resolve(url.fileURLToPath(new URL('.', import.meta.url)), p); - -export const INDENT_PADDING_BUFFER = 2; - -export const DEFAULT_MODEL = KNOWN_MODELS[0]; -export const DEFAULT_TEMPERATURE = 1.0; -export const DEFAULT_MAX_TOKENS = 1024; -export const DEFAULT_HISTORY_LENGTH = 3; -export const DEFAULT_TOKEN_PRICE = 0.000002; -export const DEFAULT_SYSTEM = 'You are a helpful assistant.'; - -export const openAIPricePerToken = process.env.OPENAI_USD_PRICE_PER_TOKEN || DEFAULT_TOKEN_PRICE; - -export const conf = new Conf({ projectName: 'chatgpt-repl' }); - -export const packageJson = jsonfile.readFileSync(resolvePath('../package.json')); - -export function updateSetting(setting, str, type) { - if (!str || str.length === 0) { - console.log(`${setting.padEnd(indentPadding + 3)} ${pc.dim(settings[setting])}`); - } else { - let value; - - try { - if (type === 'integer') - value = validateIntOption(str, `${pc.cyan(setting)} must be an integer`); - else if (type === 'float') - value = validateFloatOption(str, `${pc.cyan(setting)} must be a float`); - else if (type === 'boolean') { - value = validateBooleanOption(str, `${pc.cyan(setting)} must be a float`); - } else if (type === 'model') value = validateModel(str); - else value = str; - } catch (e) { - console.error(`${pc.red('Error')}: ${e.message}`); - - return; - } - - settings[setting] = value; - - console.log(`${pc.cyan(setting)} set to ${pc.magenta(value)}`); - } -} - -export function resetSettings() { - settings = { ...initialSettings }; - - settingsSummary('Settings reset'); -} - -const program = new Command(); - -program - .name('chatgpt-repl') - .version(packageJson.version, '-v, --version', 'Show the current version number') - .helpOption('-h, --help', 'Show help'); - -program - .description('ChatGPT REPL interactive command line tool') - .addOption( - new Option('-c, --clipboard ', 'Enable/disable copying responses to clipboard') - .default(false) - .argParser((value) => - validateBooleanOption(value, 'Clipboard copy options must be a boolean') - ) - ) - .addOption( - new Option('-k, --apiKey ', 'Set (and save) OpenAI API key').env('OPENAI_API_KEY') - ) - .addOption( - new Option('-l, --history-length ', 'Set conversation history length') - .default(DEFAULT_HISTORY_LENGTH) - .env('OPENAI_HISTORY_LENGTH') - .argParser((value) => validateIntOption(value, 'History length must be an integer')) - ) - .addOption( - new Option('-m, --model ', 'Set OpenAI model') - .default(DEFAULT_MODEL) - .env('OPENAI_MODEL') - .argParser(validateModel) - ) - .addOption( - new Option('-t, --temperature ', 'Set temperature') - .default(DEFAULT_TEMPERATURE) - .env('OPENAI_TEMPERATURE') - .argParser((value) => validateFloatOption(value, 'Temperature must be a float')) - ) - .addOption( - new Option('-s, --system ', 'Set system prompt') - .default(DEFAULT_SYSTEM) - .env('OPENAI_SYSTEM') - ) - .addOption( - new Option('-w, --word-wrap ', 'Enable/disable word wrap') - .default(true) - .argParser((value) => validateBooleanOption(value, 'Word wrap option must be a boolean')) - ) - .addOption( - new Option('-x, --max-tokens ', 'Max tokens per request') - .default(DEFAULT_MAX_TOKENS) - .env('OPENAI_MAX_TOKENS') - .argParser((value) => validateIntOption(value, 'Max tokens must be an integer')) - ); - -export let settings = program.parse().opts(); -export const indentPadding = - Math.max(...Object.keys(settings).map((k) => k.length)) + INDENT_PADDING_BUFFER; -const initialSettings = { ...settings }; - -export function settingsSummary(str) { - console.log(`\n${pc.green(str || 'Current settings:')}\n`); - - for (const [key, value] of Object.entries(settings)) - console.log(` ${key.toLowerCase().padEnd(indentPadding + 1)} ${pc.dim(value)}`); - - console.log(); -} diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..9de2a8a --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,137 @@ +import path from 'path'; +import url from 'url'; + +import { Command } from 'commander'; +import Conf from 'conf'; +import jsonfile from 'jsonfile'; +import pc from 'picocolors'; +import { z } from 'zod'; + +import settingsCmd from './commands/settingsCmd.js'; +import { validationError } from './utils.js'; +import { KNOWN_MODELS, zodBoolean, zodFloat, zodInt, zodModel } from './validate.js'; + +export const defaultSettings = { + temperature: 1.0, + maxTokens: 1024, + model: KNOWN_MODELS[0], + system: 'You are a helpful assistant', + historyLength: 5, + wordWrap: true, + clipboard: false, + apiKey: process.env['OPEN_AI_API_KEY'] || '', +}; + +const settingsSchema = z.object({ + maxTokens: zodInt(), + temperature: zodFloat(), + model: zodModel(), + apiKey: z.string().optional(), + system: z.string(), + historyLength: zodInt(), + wordWrap: zodBoolean(), + clipboard: zodBoolean(), +}); + +export const settingSchema = settingsSchema.keyof(); + +export type Settings = z.infer; +export type SettingsTypes = Settings[keyof Settings]; + +export type Setting = keyof Settings; + +export const INDENT_PADDING_BUFFER = 2; +export const DEFAULT_TOKEN_PRICE = 0.000002; + +export const openAIPricePerToken: number = + process.env.OPENAI_USD_PRICE_PER_TOKEN || DEFAULT_TOKEN_PRICE; + +const resolvePath = (filePath: string) => + path.resolve(url.fileURLToPath(new URL('.', import.meta.url)), filePath); + +export const conf = new Conf({ projectName: 'chatgpt-repl' }); + +export const packageJson = jsonfile.readFileSync(resolvePath('../package.json')); + +export const parseSetting = (setting: Setting, value: string): SettingsTypes => + settingsSchema.shape[setting].parse(value); + +const defaultSetting = (setting: Setting): string | undefined => + process.env[`OPEN_AI_${setting.toUpperCase()}`] || defaultSettings[setting]?.toString(); + +const isSetting = (field: string): field is Setting => settingSchema.safeParse(field)?.success; + +function setSetting(setting: Setting, value: SettingsTypes) { + // all this to keep typescript happy. there has to be a better way? + // https://stackoverflow.com/questions/75809343/type-string-number-is-not-assignable-to-type-never-when-dynamically-settin/75809489#75809489 + if ((setting === 'maxTokens' || setting === 'historyLength') && typeof value === 'number') + settings[setting] = value; + if ( + (setting === 'model' || setting === 'system' || setting === 'apiKey') && + typeof value === 'string' + ) + settings[setting] = value; + if ((setting === 'wordWrap' || setting === 'clipboard') && typeof value === 'boolean') + settings[setting] = value; + + console.log(`${pc.cyan(setting.toLowerCase())} set to ${pc.magenta(String(value))}`); +} + +export function updateSetting(setting: Setting, value: string) { + if (!value || value.length === 0) { + // display the current value + console.log(`${setting.padEnd(indentPadding + 3)} ${pc.dim(String(settings[setting]))}`); + } else { + try { + const parsedValue = parseSetting(setting, value); + setSetting(setting, parsedValue); + } catch (error) { + validationError(error, value); + } + } +} + +export function resetSettings(setting: string) { + if (setting) { + if (isSetting(setting)) setSetting(setting, initialSettings[setting]); + else console.log(pc.red(`Unknown setting: ${setting}`)); + } else { + // reset all settings + settings = { ...initialSettings }; + + settingsCmd('Settings reset'); + } +} + +const program = new Command(); + +program + .name('chatgpt-repl') + .version(packageJson.version, '-v, --version', 'Show the current version number') + .helpOption('-h, --help', 'Show help'); + +program + .description('ChatGPT REPL interactive command line tool') + + .option( + '-c, --clipboard ', + 'Enable/disable copying responses to clipboard', + defaultSetting('clipboard') + ) + .option('-k, --apiKey ', 'Set (and save) OpenAI API key') + .option( + '-l, --history-length ', + 'Set conversation history length', + defaultSetting('historyLength') + ) + .option('-m, --model ', 'Set OpenAI model', defaultSetting('model')) + .option('-t, --temperature ', 'Set temperature', defaultSetting('temperature')) + .option('-s, --system ', 'Set system prompt', defaultSetting('system')) + .option('-w, --word-wrap ', 'Enable/disable word wrap', defaultSetting('wordWrap')) + .option('-x, --max-tokens ', 'Max tokens per request', defaultSetting('maxTokens')); + +export let settings: Settings = settingsSchema.parse(program.parse().opts()); +const initialSettings = { ...settings }; + +export const indentPadding = + Math.max(...Object.keys(settings).map((k) => k.length)) + INDENT_PADDING_BUFFER; diff --git a/src/usage.js b/src/usage.ts similarity index 72% rename from src/usage.js rename to src/usage.ts index 3d75861..a103069 100644 --- a/src/usage.js +++ b/src/usage.ts @@ -1,4 +1,6 @@ +import { AxiosResponse } from 'axios'; import md5 from 'md5'; +import { CreateChatCompletionResponse } from 'openai'; import pc from 'picocolors'; import pluralize from 'pluralize'; @@ -8,18 +10,16 @@ import { conf, openAIPricePerToken } from './settings.js'; export let sessionUsageTokens = 0; export let sessionUsageCost = 0.0; -function costByTokens(tokens) { - return tokens * openAIPricePerToken; -} +const costByTokens = (tokens: number) => tokens * openAIPricePerToken; -export function addUsage(tokens) { +export function addUsage(tokens: number | undefined) { if (!tokens) return; sessionUsageTokens += tokens; sessionUsageCost += costByTokens(tokens); - const totalUsages = conf.get('totalUsage') || {}; - const keyHash = md5(apiKey); + const totalUsages: Record = conf.get('totalUsage') || {}; + const keyHash = md5(apiKey as string); const keyUsage = totalUsages?.[keyHash] || 0; const newTotal = keyUsage + tokens; @@ -30,7 +30,7 @@ export function addUsage(tokens) { return sessionUsageTokens; } -export function formatUsage(response) { +export function formatUsage(response: AxiosResponse) { if (!response?.data?.usage) return 'unknown'; const { @@ -47,8 +47,8 @@ export function formatUsage(response) { } export function formatTotalUsage() { - const totalUsages = conf.get('totalUsage') || {}; - const keyHash = md5(apiKey); + const totalUsages: Record = conf.get('totalUsage') || {}; + const keyHash: string = md5(apiKey); const totalKeyUsage = totalUsages?.[keyHash] || 0; return ( diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index 8423162..0000000 --- a/src/utils.js +++ /dev/null @@ -1,20 +0,0 @@ -import readline from 'readline'; -import wrapText from 'wrap-text'; - -import pc from 'picocolors'; - -export function clearLine() { - readline.clearLine(process.stdout, 0); - readline.cursorTo(process.stdout, 0); -} - -export function errorMsg(str) { - clearLine(); - console.error(`${pc.red('Error')}: ${str}`); -} - -export const wrap = (str, width) => - str - .split('\n') - .map((line) => wrapText(line, width)) - .join('\n'); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..8cac702 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,39 @@ +import pc from 'picocolors'; +import readline from 'readline'; +import wrapText from 'wrap-text'; +import { z } from 'zod'; + +export function clearLine() { + readline.clearLine(process.stdout, 0); + readline.cursorTo(process.stdout, 0); +} + +export function errorMsg(str: string) { + clearLine(); + console.error(`${pc.red('Error')}: ${str}`); +} + +export const wrap = (text: string, width: number) => + text + .split('\n') + .map((line) => wrapText(line, width)) + .join('\n'); + +export const getErrorMessage = (error: unknown, str?: string) => + error instanceof Error ? error.message : str ? `${str} (${String(error)})` : String(error); + +export const validationError = (error: unknown, setting: string) => { + if (error instanceof z.ZodError) { + if (error.issues[0].code === 'invalid_type') + console.error( + `${pc.red('Error')}: Incorrect type for ${setting}. ${error.issues[0].message}` + ); + else + console.error( + `${pc.red('Error')}: ${pc.cyan(error.issues[0].code)}: ${error.issues[0].message}` + ); + } else + console.error( + `${pc.red('Error')}: ${getErrorMessage(error, `Unknown error updating ${setting}`)}` + ); +}; diff --git a/src/validate.js b/src/validate.js deleted file mode 100644 index 1a0d633..0000000 --- a/src/validate.js +++ /dev/null @@ -1,71 +0,0 @@ -import { boolean, isBooleanable } from 'boolean'; -import pc from 'picocolors'; - -import { InvalidOptionArgumentError } from 'commander'; - -export const KNOWN_MODELS = [ - 'gpt-3.5-turbo', - 'gpt-3.5-turbo-0301', - 'gpt-4', - 'gpt-4-0314', - 'gpt-4-32k', - 'gpt-4-32k-0314', -]; -const UNSUPPORTED_MODELS = [ - 'text-davinci-003', - 'text-davinci-002', - 'text-davinci-edit-001', - 'code-davinci-edit-001', - 'whisper-1', - 'text-curie-001', - 'text-babbage-001', - 'text-ada-001', - 'davinci', - 'curie', - 'babbage', - 'ada', - 'text-embedding-ada-002', - 'text-search-ada-doc-001', - 'text-moderation-stable', - 'text-moderation-latest', -]; - -export function validateIntOption(value, message) { - const num = parseInt(value, 10); - if (Number.isNaN(num)) throw new InvalidOptionArgumentError(message); - - return num; -} - -export function validateFloatOption(value, message) { - const num = parseFloat(value); - if (Number.isNaN(num)) throw new InvalidOptionArgumentError(message); - - return num; -} - -export function validateModel(model) { - if (!model) throw new InvalidOptionArgumentError('Model must not be empty'); - - if (UNSUPPORTED_MODELS.includes(model)) - throw new InvalidOptionArgumentError( - `Model ${model} is not supported, only chat completion models (${KNOWN_MODELS.join( - ', ' - )}) can be used at this time.` - ); - - if (!KNOWN_MODELS.includes(model)) - console.warn( - `${pc.yellow( - 'Warning' - )}: '${model}' is not a known OpenAI model for chat completions. Use at your own risk.\n` - ); - - return model; -} - -export function validateBooleanOption(value, message) { - if (!isBooleanable(value)) throw new InvalidOptionArgumentError(message); - - return boolean(value); -} diff --git a/src/validate.ts b/src/validate.ts new file mode 100644 index 0000000..6aad02d --- /dev/null +++ b/src/validate.ts @@ -0,0 +1,71 @@ +import { boolean, isBooleanable } from 'boolean'; +import pc from 'picocolors'; +import { z } from 'zod'; + +export const KNOWN_MODELS = [ + 'gpt-3.5-turbo', + 'gpt-3.5-turbo-0301', + 'gpt-4', + 'gpt-4-0314', + 'gpt-4-32k', + 'gpt-4-32k-0314', +]; +export const UNSUPPORTED_MODELS = [ + 'text-davinci-003', + 'text-davinci-002', + 'text-davinci-edit-001', + 'code-davinci-edit-001', + 'whisper-1', + 'text-curie-001', + 'text-babbage-001', + 'text-ada-001', + 'davinci', + 'curie', + 'babbage', + 'ada', + 'text-embedding-ada-002', + 'text-search-ada-doc-001', + 'text-moderation-stable', + 'text-moderation-latest', +]; + +// zod helpers to enforce integer, floats and flexible boolean string value +export const zodInt = () => + z.preprocess((v) => parseFloat(z.coerce.string().parse(v)), z.number().int()); +export const zodFloat = () => + z.preprocess((v) => parseFloat(z.coerce.string().parse(v)), z.number()); + +export const zodBoolean = () => + z.preprocess( + (value) => + isBooleanable(value) + ? boolean(value) + : new z.ZodError([ + { + fatal: true, + message: 'Not a boolean', + path: [''], + code: 'invalid_type', + expected: 'boolean', + received: 'string', + }, + ]), + z.boolean() + ); + +export const zodModel = () => + z.string().refine((model) => { + if (UNSUPPORTED_MODELS.includes(model)) + throw new Error( + `'${model}' is not supported by the OpenAI Chat Completions API. See the list at https://platform.openai.com/docs/models/overview.` + ); + + if (!KNOWN_MODELS.includes(model)) + console.log( + `${pc.yellow( + 'Warning' + )}: '${model}' is not a know model for the OpenAI Chat Completions API. Use at your own risk. See the list at https://platform.openai.com/docs/models/overview.` + ); + + return true; + }); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..8c87c85 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "Node16", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] +}