From 1b92d14a6034801178c7809927f900f59cd276a0 Mon Sep 17 00:00:00 2001 From: Jonathan Atiene <34762800+bemijonathan@users.noreply.github.com> Date: Sat, 8 Apr 2023 19:28:04 +0100 Subject: [PATCH] added git module and logo (#4) * added git module still testing * added git score for project * fix: readme to add git integration * added logo --- feedback-samples/feedback-2.txt | 20 + feedback-samples/feedback-3.txt | 66 + feedback-samples/feedback.txt | 68 + feedback.txt | 21 - index.ts | 16 +- logo.png | Bin 0 -> 34876 bytes package-lock.json | 2544 ++++++++++++++++++++++++++++++- package.json | 6 +- readme.md | 23 +- src/code-review.ts | 87 +- src/filehandler.ts | 22 +- src/git.ts | 74 +- src/index.ts | 12 +- src/openai.ts | 64 +- src/rule.ts | 15 + src/rules/constants | 12 - src/rules/constants-ts | 20 - src/rules/rule.txt | 19 - types/index.ts | 13 + 19 files changed, 2916 insertions(+), 186 deletions(-) create mode 100644 feedback-samples/feedback-2.txt create mode 100644 feedback-samples/feedback-3.txt create mode 100644 feedback-samples/feedback.txt delete mode 100644 feedback.txt create mode 100644 logo.png create mode 100644 src/rule.ts delete mode 100644 src/rules/constants delete mode 100644 src/rules/constants-ts delete mode 100644 src/rules/rule.txt diff --git a/feedback-samples/feedback-2.txt b/feedback-samples/feedback-2.txt new file mode 100644 index 0000000..293ac3a --- /dev/null +++ b/feedback-samples/feedback-2.txt @@ -0,0 +1,20 @@ +Path: src/code-review.ts + + + Criticism: Issues: +- The rules for the code review are hard-coded in the class constructor which makes it difficult to modify or update them without changing the code. +- The projectPath property is not used and should be removed. +- The code should be modularized and separated into smaller, more focused functions to improve organization, readability, and maintenance. +- There are no tests in place, which makes it difficult to ensure correct functionality and prevent regressions. +- The method for getting the project configuration is not clear and it's unclear how it's used in the rest of the code. +- There is no error handling for some critical methods such as getFilesContent and queue, which can cause the entire program to crash. + +Recommendations: +- Move the rules to a separate file or configuration object that can be easily changed or updated. +- Remove the projectPath property and use the getProjectConfig method instead to get the project path. +- Refactor the review method to break down the functionality into smaller functions that are easier to test and maintain. +- Write unit tests to ensure correct functionality and catch errors early. +- Clarify the getProjectConfig method and how it's used in the rest of the code. +- Add error handling to critical methods to prevent crashes and improve stability. + + \ No newline at end of file diff --git a/feedback-samples/feedback-3.txt b/feedback-samples/feedback-3.txt new file mode 100644 index 0000000..a36c7f4 --- /dev/null +++ b/feedback-samples/feedback-3.txt @@ -0,0 +1,66 @@ +Path: src/code-review.ts + + + Criticism: Issues: +- Lack of documentation for the CodeReviewer class and its methods +- Unused and outdated rules variable +- Inconsistent naming convention for the project path in the constructor and getFilesContent method +- CodeReviewer constructor should not have a projectPath parameter if getProjectConfig method is used +- Incomplete implementation for reviewing changes in Git projects +- No implementation for applying the rules to the code and generating feedback + +Recommendations: +- Add JSDoc comments to the CodeReviewer class and its methods to improve readability and maintainability +- Remove the rules variable and use the rules imported from the rule module instead +- Use consistent naming convention for the project path parameter in the constructor and getFilesContent method to avoid confusion +- Remove the projectPath parameter from the constructor and use the getProjectConfig method to retrieve the project config instead +- Implement the logic for reviewing changes in Git projects and only review the changed files +- Add the implementation for applying the rules to the code and generating feedback based on violations +- Consider implementing batching of files for parallel requests if there are more than 10 files in the queue to improve performance + + Path: src/filehandler.ts + + + Criticism: Issues: +- The naming of the class 'FileHandlers' should be singular, i.e. 'FileHandler'. +- The code includes repeated logic for checking the existence and parsing of the 'codereview.json' file. This can be refactored into a separate function to avoid redundancy. +- The use of the process.cwd() method within the FileHandler class tightly couples the class to the file system. It would be better to pass the projectPath as a parameter to the constructor or the functions that require it. This would also make the code more modular and easier to test. +- The code could benefit from additional comments or function-docstrings to improve its readability and maintainability. + +Recommendations: +- Rename the class to 'FileHandler'. +- Refactor the code that handles the 'codereview.json' file into a separate function. +- Pass the projectPath as a parameter to the constructor or the functions that require it. +- Add comments or function-docstrings to improve the code's clarity and maintainability. + + Path: src/git.ts + + + Criticism: Issues: +- No major issues detected. However, there are some minor improvements that can be made for better readability and maintenance. + +Recommendations: +- Add JSDoc style comments to document the purpose and inputs/outputs of each function +- Combine the isGitRepository and getCurrentBranch functions to reduce redundancy and improve performance +- Use async/await syntax consistently throughout the codebase (e.g., in the isGitRepository function) +- Consider defining interfaces and types for function inputs and outputs to improve reliability and maintainability + + Path: src/index.ts + + + Criticism: Issues: +- Import statement for chalk is unused (line 2) +- CodeReviewer class is initialized with unnecessary argument (line 15) +- No newline at the end of the file (line 29) + +Recommendations: +- Remove import statement for chalk +- Remove argument from CodeReviewer initialization +- Add a newline at the end of the file for consistency + + Path: types/index.ts + + + Criticism: No issues detected + + \ No newline at end of file diff --git a/feedback-samples/feedback.txt b/feedback-samples/feedback.txt new file mode 100644 index 0000000..5c956be --- /dev/null +++ b/feedback-samples/feedback.txt @@ -0,0 +1,68 @@ +Path: src/code-review.ts + + + Criticism: Issues: +- The code lacks clear documentation and comments for better readability and maintainability +- The rules description in the code is redundant and poorly formatted, which makes it hard to read and understand +- The CodeReviewer constructor accepts a projectPath argument that is not used, but it should rather get the project config using the getProjectConfig method +- The queue method throws an error if a file can't be read, but it doesn't provide any useful error message to help identify the problem +- The CodeReviewer review method lacks proper error handling if any exception is thrown during its execution +- The queue method can potentially cause performance issues if there are too many files to read due to running them all in parallel; it should consider batching them into smaller groups instead +- The git review feature only reviews the files that are changed in the latest commit, but it should also consider checking for files modified in previous commits since the last review +- The git review feature doesn't provide any error handling for git commands or errors that may occur during its execution + +Recommendations: +- Add clear and concise documentation and comments to the code to improve its readability and maintainability +- Refactor the rules description to be easier to read and understand +- Remove the projectPath argument from the CodeReviewer constructor and use the getProjectConfig method instead to get the project configuration +- Improve the error handling of the queue method by providing helpful error messages to diagnose the issue +- Add proper error handling to the CodeReviewer review method to handle any exceptions that may occur during its execution +- Consider batching the files into smaller groups in the queue method to prevent potential performance issues when there are too many files to read +- Update the git review feature to include previous commit file changes and provide error handling for git commands and errors. + + Path: src/filehandler.ts + + + Criticism: Issues: +- The method name getProjectConfig is not clear on what it returns or what it is used for (line 5) +- The default config object is hardcoded and not defined as a constant (lines 16-21) + +Recommendations: +- Rename getProjectConfig method to something more descriptive like fetchProjectConfig or loadProjectConfig (line 5) +- Define the default config object as a constant and export it from a separate configuration file to avoid hardcoded values (lines 16-21) + +Note: The code provided seems to only contain one file, so it's difficult to fully review the overall organization and separation of concerns. + + Path: src/git.ts + + + Criticism: Issues: +- No major issues detected. + +Recommendations: +- Consider adding more documentation for better maintainability. +- Consider adding more unit tests for higher coverage. + + Path: src/index.ts + + + Criticism: Issues: +- Unused import of chalk module (line 2). +- CodeReviewer class constructor does not receive project path as an argument, which contradicts its name (line 15). +- The projectPath property is assigned with __dirname, which may not always represent the project directory (line 12). +- There is no handling for errors thrown by ConfigStore constructor (line 13). +- There is no newline at the end of the file (line 35). + +Recommendations: +- Remove the chalk import to optimize performance (line 2). +- Change CodeReviewer constructor to receive project path as an argument or rename it to reflect its actual purpose (line 15). +- Improve project directory discovery using a more reliable method (e.g. process.cwd()) (line 12). +- Implement error handling for ConfigStore constructor using try-catch (line 13). +- Add a newline at the end of the file for consistency. + + Path: types/index.ts + + + Criticism: No issues detected. The provided code only includes interface definitions and follows the provided rules for clear naming conventions and use of interface definitions. However, additional code would need to be reviewed in order to ensure adherence to the other rules such as logic organization, functionality, error handling, testing, and scalability. + + \ No newline at end of file diff --git a/feedback.txt b/feedback.txt deleted file mode 100644 index fb5266a..0000000 --- a/feedback.txt +++ /dev/null @@ -1,21 +0,0 @@ -Path: /Users/jonathan/dev/auto_reviewer/dist/index.js - - - Criticism: No criticism found - - Path: /Users/jonathan/dev/auto_reviewer/dist/src/code-review.js - - - Criticism: No criticism found - - Path: /Users/jonathan/dev/auto_reviewer/dist/src/config.js - - - Criticism: No criticism found - - Path: /Users/jonathan/dev/auto_reviewer/dist/src/filehandler.js - - - Criticism: No criticism found - - \ No newline at end of file diff --git a/index.ts b/index.ts index 53cfd3e..c1023b1 100644 --- a/index.ts +++ b/index.ts @@ -34,11 +34,23 @@ const autoReviewer = new AutoReviewer(); const config = new ConfigStore(); if (config.get('openai_api_key')) { - autoReviewer.codeReview(); + autoReviewer.codeReview().then(async () => { + const score = await autoReviewer.getScore(); + Utils.sleep(1000); + Utils.log(chalk.greenBright.bold('Code Review Completed successfully ☑️')); + Utils.log(chalk.greenBright.bold(`Your code score is: ${score} / 10`)); + + process.exit(0); + }); } else { config.promptUserForApiKey().then(() => { Utils.sleep(1000); - autoReviewer.codeReview(); + Utils.log(chalk.greenBright.bold(`API Key saved successfully ☑️ + + Please run the command again to start the code review + + `)); + process.exit(0); }) } diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..43d6009bf1e79d04ade17a2fc57b582fe59e6fda GIT binary patch literal 34876 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 HeV_jZyVW#~ literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 4326cae..9198852 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,2478 @@ { - "name": "auto_reviewer", - "version": "1.0.0", - "lockfileVersion": 1, + "name": "ai_code_review", + "version": "1.0.5", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "ai_code_review", + "version": "1.0.5", + "license": "ISC", + "dependencies": { + "axios": "^1.3.4", + "chalk": "4.1.0", + "configstore": "5.0.0", + "diff": "^5.1.0", + "eslint": "^8.35.0", + "inquirer": "8.1.5", + "openai": "^3.2.1", + "simple-git": "^3.17.0", + "yargs": "^17.7.1" + }, + "bin": { + "code_review": "dist/index.js" + }, + "devDependencies": { + "@types/configstore": "5.0.0", + "@types/diff": "^5.0.3", + "@types/inquirer": "^9.0.3", + "@types/node": "^18.14.6", + "ts-node-dev": "^2.0.0", + "typescript": "^4.9.5" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", + "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", + "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/configstore": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-5.0.0.tgz", + "integrity": "sha512-A48oa2v2dKyy5QNqfAlfvibgiJagh2mkWmsGMOE1LtqtwUH2WkS76VNfAUZ55h42TCr3jADpz/s6TbPfIjOuvw==", + "dev": true + }, + "node_modules/@types/diff": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.0.3.tgz", + "integrity": "sha512-amrLbRqTU9bXMCc6uX0sWpxsQzRIo9z6MJPkH1pkez/qOxuqSZVuryJAWoBRq94CeG8JxY+VK4Le9HtjQR5T9A==", + "dev": true + }, + "node_modules/@types/inquirer": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.3.tgz", + "integrity": "sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw==", + "dev": true, + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/node": { + "version": "18.14.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.6.tgz", + "integrity": "sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==", + "dev": true + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", + "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/configstore": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", + "integrity": "sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ==", + "dependencies": { + "dot-prop": "^5.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", + "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "dependencies": { + "@eslint/eslintrc": "^2.0.0", + "@eslint/js": "8.35.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openai": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/openai/-/openai-3.2.1.tgz", + "integrity": "sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A==", + "dependencies": { + "axios": "^0.26.0", + "form-data": "^4.0.0" + } + }, + "node_modules/openai/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-git": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz", + "integrity": "sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw==", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/ts-node-dev/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@cspotcode/source-map-support": { "version": "0.8.1", @@ -76,6 +2546,19 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "requires": { + "debug": "^4.1.1" + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -129,6 +2612,12 @@ "integrity": "sha512-A48oa2v2dKyy5QNqfAlfvibgiJagh2mkWmsGMOE1LtqtwUH2WkS76VNfAUZ55h42TCr3jADpz/s6TbPfIjOuvw==", "dev": true }, + "@types/diff": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.0.3.tgz", + "integrity": "sha512-amrLbRqTU9bXMCc6uX0sWpxsQzRIo9z6MJPkH1pkez/qOxuqSZVuryJAWoBRq94CeG8JxY+VK4Le9HtjQR5T9A==", + "dev": true + }, "@types/inquirer": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.3.tgz", @@ -174,7 +2663,8 @@ "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} }, "acorn-walk": { "version": "8.2.0", @@ -482,10 +2972,9 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" }, "doctrine": { "version": "3.0.0", @@ -503,11 +2992,6 @@ "is-obj": "^2.0.0" } }, - "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" - }, "dynamic-dedupe": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", @@ -1377,6 +3861,16 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-git": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz", + "integrity": "sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw==", + "requires": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1393,6 +3887,14 @@ "source-map": "^0.6.0" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1403,14 +3905,6 @@ "strip-ansi": "^6.0.1" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1496,6 +3990,14 @@ "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } } }, "ts-node-dev": { diff --git a/package.json b/package.json index 4622961..68dac35 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "license": "ISC", "devDependencies": { "@types/configstore": "5.0.0", + "@types/diff": "^5.0.3", "@types/inquirer": "^9.0.3", "@types/node": "^18.14.6", "ts-node-dev": "^2.0.0", @@ -29,10 +30,11 @@ "axios": "^1.3.4", "chalk": "4.1.0", "configstore": "5.0.0", - "dotenv": "^16.0.3", + "diff": "^5.1.0", "eslint": "^8.35.0", "inquirer": "8.1.5", "openai": "^3.2.1", + "simple-git": "^3.17.0", "yargs": "^17.7.1" }, "repository": { @@ -43,4 +45,4 @@ "url": "https://github.com/bemijonathan/code-critique-ai/issues" }, "homepage": "https://github.com/bemijonathan/code-critique-ai#readme" -} \ No newline at end of file +} diff --git a/readme.md b/readme.md index 8f9bbce..d459b2e 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,10 @@ # Code Critique +

+Code Critique Logo +

+
+ Code Critique is an AI-powered command-line interface (CLI) tool that helps review code in projects before raising pull requests (PRs). It helps reduce the time spent on code reviews. ## Features @@ -27,18 +32,31 @@ Using OpenAI, Code Critique reviews changes in files, criticizes bad coding habi `code_review` all criticism is put in a file called `feedback.txt` + + ### using github + + if you want to review only your git changes +add this configuration file to the root of your document. + + // codereview.json + { + "name": "", + "description": "", + "git": true, + "defaultBranch": "master" + } ## Roadmap - [x] AI code reviews -- [ ] Version control integration +- [x] Version control integration - [ ] Security reviews - [ ] Architecture reviews ## Todo -- [ ] Git integration +- [x] Git integration - [x] Retrieve files and send them to OpenAI - [x] Receive responses from OpenAI - [x] Send responses to the user @@ -46,6 +64,7 @@ all criticism is put in a file called `feedback.txt` - [x] Publish the module - [ ] Set up continuous integration - [ ] Add support for Vue.js +- [ ] Move reviewed code from feedback.txt to locally hosted html and css ## Contributing diff --git a/src/code-review.ts b/src/code-review.ts index 2ac4d98..b7ad9d7 100644 --- a/src/code-review.ts +++ b/src/code-review.ts @@ -1,74 +1,56 @@ import path from "path"; -import { Feedback, FileContent } from "../types"; +import { Feedback, FileContent, GitDiff, ProjectConfig } from "../types"; import { OpenAI } from "./openai"; import { FileHandlers } from "./filehandler"; import { Utils } from "./utils"; +import { rules } from "./rule"; +import { Git } from "./git"; -// TODO: we should be able to get feed back per line of code +// TODO: #3 we should be able to get feed back per line of code export class CodeReviewer { fileHandler = new FileHandlers() - constructor(projectPath: string) { - this.projectPath = projectPath; + private openAI: OpenAI; + private rules: string = rules + private feedbacks: Feedback[]; + git: Git + scores: number[] = []; + + constructor() { this.openAI = new OpenAI(); this.feedbacks = []; + this.git = new Git(); } - private openAI: OpenAI; - private rules: string = ` - Use clear and concise naming conventions for variables, functions, and classes. - Organize the code logically, following best practices for modularity and separation of concerns. - Ensure the code fulfills its intended functionality and performs as expected. - Write readable, maintainable, and well-documented code, using comments where necessary. - Optimize code for performance, avoiding redundant or inefficient operations. - Implement error handling to prevent potential bugs or crashes. - Adhere to industry best practices for data handling, security, and access control. - Thoroughly test the code, addressing known bugs or issues and ensuring high test coverage. - Write scalable code that can handle a large number of users or requests. - Comply with relevant regulations, standards, or guidelines. - Use up-to-date, secure dependencies and manage them to avoid conflicts or vulnerabilities. - Decouple code from external dependencies to make it more testable and modular. - Avoid side effects and ensure predictable behavior. - Maintain a consistent style, including naming conventions for constants and global variables. - Utilize modern JavaScript or TypeScript features for concise and readable code. - Define interfaces and types for objects and data structures. - Use enums for fixed sets of values and "readonly" for preventing unintended data modifications. - Leverage async/await syntax for asynchronous code and destructuring for extracting properties. - Employ arrow functions and default parameter values for concise code. - `; - private feedbacks: Feedback[]; - projectPath: string = ''; + async getProjectConfig() { + return await this.fileHandler.getProjectConfig(); + } + /** + * if there is git in the project then we should get the changed files and get the content of the changed files + * and also only review the changes + */ @Utils.catchError async review() { - // await this.getRules(); - const files = await this.getFilesContent(); - const queue = await this.queue(files); + const codeConfig = await this.getProjectConfig(); this.fileHandler.delete('feedback.txt'); - return this.getCodeReview(queue); - } - - @Utils.catchError - private async getRules() { - const rules = await this.fileHandler.getFileContent(path.join(__dirname, '..', 'src', 'rules', 'rule.txt')); - - - this.rules = rules.content; - - }; - - - @Utils.catchError - public getFeedbacks(): Feedback[] { - return this.feedbacks; + if (codeConfig?.git) { + // we will get the changed files and only review the changed files + const changedFiles = await this.git.getChangedFiles(codeConfig.defaultBranch); + const queue = await this.git.getTextualDifferences(codeConfig.defaultBranch, changedFiles); + return this.getCodeReview(queue); + } else { + const files = await this.getFilesContent(); + const queue = await this.queue(files); + return this.getCodeReview(queue); + } } @Utils.catchError public async queue(files: string[]) { // creates a giant queue of all the text in each files in the project - // TODO: if the files are more than 10 we should consider batching them into groups of 10 parallel requests const queue = await Promise.all(files.map((file) => { return this.fileHandler.getFileContent(file); })) @@ -78,7 +60,6 @@ export class CodeReviewer { @Utils.catchError public getFilesContent(): string[] { // gets all the files in the parent directory - return this.fileHandler.getFilesInDirectory(['.js', '.ts', '.tsx', '.jsx']); } @@ -95,6 +76,14 @@ export class CodeReviewer { path: file.path, criticism: codeReview ? codeReview : 'No criticism found' }) + if (codeReview) { + const score = await this.openAI.getScore(codeReview); + if (isNaN(Number(score))) { + this.scores.push(0); + } else { + this.scores.push(Number(score)); + } + } } } diff --git a/src/filehandler.ts b/src/filehandler.ts index b815c7f..f2bf571 100644 --- a/src/filehandler.ts +++ b/src/filehandler.ts @@ -1,15 +1,26 @@ import * as fs from 'fs'; import { Utils } from './utils'; +import { ProjectConfig } from '../types'; export class FileHandlers { + cwd = process.cwd(); + projectFiles: string[] = []; - constructor() { + async getProjectConfig() { + // if there is a code-review.json file in the project then we should use that + // if not then we should return a default config + if (fs.existsSync(`${this.cwd}/codereview.json`)) { + const { content } = await this.getFileContent(`${this.cwd}/codereview.json`); + return JSON.parse(content.toString()); + } + return { + name: 'ai-code-review', + description: 'ai-code-review', + git: false, + defaultBranch: 'master', + } } - cwd = process.cwd(); - - projectFiles: string[] = []; - @Utils.catchError getFilesInDirectory(extensions: string[], projectPath?: string,): string[] { @@ -17,7 +28,6 @@ export class FileHandlers { const files = fs.readdirSync(projectPath); - // uses a recursive function to get all the files in the directory files.forEach((file) => { // exclude the node_modules folder diff --git a/src/git.ts b/src/git.ts index 5a02d8b..c3a31cc 100644 --- a/src/git.ts +++ b/src/git.ts @@ -1,7 +1,71 @@ -class Git { - getChangedFiles() { - // npm i simple-git - return "changes"; - +import simpleGit, { SimpleGit } from "simple-git"; +import * as Diff from "diff"; +import { FileContent } from "../types"; + +export class Git { + private git: SimpleGit; + currentBranch: string = ''; + + constructor() { + this.git = simpleGit(process.cwd()); + + if (!this.isGitRepository()) { + throw new Error("This is not a git repository"); + } + } + + isGitRepository(): Promise { + return this.git.checkIsRepo(); + } + + + + async getChangedFiles(oldBranch: string): Promise { + await this.getCurrentBranch(); + const diffSummary = await this.git.diffSummary([oldBranch, this.currentBranch]); + return diffSummary.files.map((file) => file.file); + } + + async getTextualDifferences(oldBranch: string, files: string[]): Promise { + await this.getCurrentBranch(); + const diffs: FileContent[] = []; + + for (const file of files) { + try { + const allowedFileTypes = ['js', 'ts', 'jsx', 'tsx']; + + if (!allowedFileTypes.includes(file.split('.').pop() || '')) { + continue; + } + + const oldContentPromise = this.git.show([`${oldBranch}:${file}`]).catch(() => null); + const newContentPromise = this.git.show([`${this.currentBranch}:${file}`]).catch(() => null); + + const [oldContent, newContent] = await Promise.all([oldContentPromise, newContentPromise]); + + if (oldContent === null) { + // File does not exist in old branch, it's a new file + diffs.push({ path: file, content: `New file:\n${newContent}` }); + } else { + const contentDiff = Diff.createPatch(file, oldContent, newContent || ''); + diffs.push({ path: file, content: contentDiff }); + } + } catch (error) { + console.warn(`Error processing file ${file}: ${(error as Error).message}`); + } + } + + return diffs; + } + + async getCurrentBranch() { + if (this.currentBranch.length) { + return; + } + const status = await this.git.status(); + if (!status.current) { + throw new Error("Could not get current branch"); + } + this.currentBranch = status.current; } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 2f30c03..5d07a58 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,21 +1,22 @@ -import chalk from 'chalk'; import { CodeReviewer } from './code-review'; import { ConfigStore } from './config'; +import { FileHandlers } from './filehandler'; import { Utils } from './utils'; export class AutoReviewer { private _codeReview: CodeReviewer; + private fileHandler: FileHandlers; projectPath: string; config: ConfigStore constructor() { this.projectPath = __dirname; this.config = new ConfigStore(); - this._codeReview = new CodeReviewer(this.projectPath); + this._codeReview = new CodeReviewer(); + this.fileHandler = new FileHandlers(); } - @Utils.catchError public async codeReview() { Utils.spin('start'); @@ -24,4 +25,9 @@ export class AutoReviewer { } + @Utils.catchError + public async getScore() { + // find the average of the scores + return this._codeReview.scores.reduce((a, b) => a + b, 0) / this._codeReview.scores.length; + } } \ No newline at end of file diff --git a/src/openai.ts b/src/openai.ts index d98d473..bae66e3 100644 --- a/src/openai.ts +++ b/src/openai.ts @@ -19,35 +19,56 @@ export class OpenAI { if (!rules) { throw new Error('Rules are required'); } - const prompt = `Title: Code Review Assistance + const prompt = ` - Language: javascript/typescript - Framework/Library: React, Angular, Vue, Node, Express, etc. + review the following code based on the essential rules provided below: + + Rules: + ${rules} - Code Snippet: + Git diff: ${fileContent} - Project Description: - this is a project for reviews code and provide feedback and also provide a score for the code review or seniority level - - Specific Concerns: - ${rules} - - Review Guidelines: + Review Instructions: + + 1. Identify critical code issues. + 2. Keep your response concise and structured. + 3. Address concerns and provide improvement recommendations. + + Example of a structured review: + + Issues: + - Ambiguous names in calculateTotal (line 12) + - fetchData lacks error handling (line 32) + + Recommendations: + - Rename vars in calculateTotal: a -> price, b -> quantity + - Implement try-catch & error logging in fetchData for robustness + + If no issues: + - No issues detected + + `; + + return this.getCompletion(prompt); - Provide strict criticism and recommendations for improvement. - Focus on the most critical issues in the code. - Call out specific method names, line numbers, or class names in the criticism. - Keep your response concise and limited to 3 paragraphs. - Please provide a structured critique, addressing the concerns listed above and offering recommendations for improvement. Focus only on the most important aspects that need improvement and keep your feedback brief, while mentioning specific method names, line numbers, or class names. + } - Here's an example of a strict criticism response: + async getScore(feedback: string) { + const prompt = ` + with these review for a file what is your score on a range of 1-10 on code correctness and stability - Criticism: The code snippet has several critical areas that need improvement. Firstly, in the calculateTotal method (line 12), the naming conventions for variables a and b are ambiguous and not descriptive enough, making the code hard to understand. Secondly, the fetchData function (line 32) lacks proper error handling, which could lead to unexpected crashes or behavior. + reply with only a number - Recommendations: To improve the code, start by renaming variables a and b in the calculateTotal method to more descriptive names, such as price and quantity. This will significantly enhance the code's readability and maintainability. Next, implement robust error handling within the fetchData function, using try-catch blocks and proper error logging to ensure that the code is more resilient to unexpected inputs or scenarios, preventing potential crashes or unexpected behavior. Focus on these two critical areas to create a more reliable and comprehensible codebase. + eg: 1 + ${feedback} `; + + return this.getCompletion(prompt); + } + + async getCompletion(prompt: string) { const response = await this.openAI.createChatCompletion({ messages: [{ role: "user", @@ -59,9 +80,4 @@ export class OpenAI { return response.data.choices[0].message?.content; } - - - // scoreCodeReview(feedback: string) { - - // } } \ No newline at end of file diff --git a/src/rule.ts b/src/rule.ts new file mode 100644 index 0000000..eb323c9 --- /dev/null +++ b/src/rule.ts @@ -0,0 +1,15 @@ +export const rules = ` +- Descriptive naming for variables, functions, and classes +- Logical organization with modularity and separation of concerns +- Correct functionality and expected performance +- Readability, maintainability, and documentation +- Performance optimization and avoidance of redundancy +- Error handling implementation +- Adherence to data handling, security, and access control best practices +- Thorough testing and high test coverage +- Scalability for large user base or requests +- Consistent style and naming conventions +- Use of modern JavaScript or TypeScript features +- Definition of interfaces and types for objects and data structures +- Async/await syntax and destructuring utilization +` \ No newline at end of file diff --git a/src/rules/constants b/src/rules/constants deleted file mode 100644 index 53a2107..0000000 --- a/src/rules/constants +++ /dev/null @@ -1,12 +0,0 @@ -Code organization: Check if the code is well-organized, easy to read, and follows a logical structure. -Functionality: Verify that the code fulfills the intended functionality and performs as expected. -Code readability: Ensure that the code is easy to read, understand, and maintain. Check for clear and concise naming conventions, well-written comments, and documentation. -Code efficiency: Check that the code is optimized for performance and that there are no redundant or inefficient lines of code. -Error handling: Verify that the code handles errors gracefully and that there are no potential bugs or crashes. -Security: Check that the code is secure and follows industry best practices for data handling, encryption, and access control. -Testing: Verify that the code has been thoroughly tested and that there are no known bugs or issues. -Scalability: Check that the code is scalable and can handle a large number of users or requests. -Compliance: Ensure that the code complies with any relevant regulations, standards, or guidelines. -Dependencies: Verify that the code uses up-to-date and secure dependencies, and that there are no potential conflicts or vulnerabilities. -Naming conventions: Clear and consistent naming conventions can improve code readability and maintainability. -Testable code: Testable code is code that is designed to be easy to test and has a high degree of test coverage. \ No newline at end of file diff --git a/src/rules/constants-ts b/src/rules/constants-ts deleted file mode 100644 index 191b8b0..0000000 --- a/src/rules/constants-ts +++ /dev/null @@ -1,20 +0,0 @@ -Check that TypeScript's type system is being used effectively to catch errors and improve code quality. -Verify that the code is written in a style that is consistent with the project's coding guidelines. -Verify that the code follows the current version of ECMAScript. -Check that the code is readable, maintainable, and easy to understand. -Ensure that the code is well-organized and follows a logical structure. -Verify that the code is optimized for performance and that redundant or inefficient lines have been removed. -Ensure that errors are being handled gracefully and that potential bugs or crashes have been avoided. -Check that industry best practices are being followed for data handling, encryption, and access control. -Verify that the code has been thoroughly tested and that any known bugs or issues have been addressed. -Check that the code is scalable and can handle a large number of users or requests. -Verify that the code complies with relevant regulations, standards, or guidelines. -Check that the project is using up-to-date and secure dependencies and that potential conflicts or vulnerabilities have been avoided. -Ensure that the code has been broken down into small, modular functions that can be tested in isolation. -Check that the code is decoupled from external dependencies to make it more testable. -Ensure that there are no side effects that could cause unexpected behavior. -Verify that a consistent naming convention has been followed for variables, functions, and classes. -Check that the code is designed to be easy to test and has a high degree of test coverage. -Verify that the project's documentation is up-to-date and thorough. -Ensure that the project's build and deployment process is automated and reliable. -Check that the project's continuous integration and continuous deployment (CI/CD) pipeline is working correctly. \ No newline at end of file diff --git a/src/rules/rule.txt b/src/rules/rule.txt deleted file mode 100644 index b919002..0000000 --- a/src/rules/rule.txt +++ /dev/null @@ -1,19 +0,0 @@ -Use clear and concise naming conventions for variables, functions, and classes. -Organize the code logically, following best practices for modularity and separation of concerns. -Ensure the code fulfills its intended functionality and performs as expected. -Write readable, maintainable, and well-documented code, using comments where necessary. -Optimize code for performance, avoiding redundant or inefficient operations. -Implement error handling to prevent potential bugs or crashes. -Adhere to industry best practices for data handling, security, and access control. -Thoroughly test the code, addressing known bugs or issues and ensuring high test coverage. -Write scalable code that can handle a large number of users or requests. -Comply with relevant regulations, standards, or guidelines. -Use up-to-date, secure dependencies and manage them to avoid conflicts or vulnerabilities. -Decouple code from external dependencies to make it more testable and modular. -Avoid side effects and ensure predictable behavior. -Maintain a consistent style, including naming conventions for constants and global variables. -Utilize modern JavaScript or TypeScript features for concise and readable code. -Define interfaces and types for objects and data structures. -Use enums for fixed sets of values and "readonly" for preventing unintended data modifications. -Leverage async/await syntax for asynchronous code and destructuring for extracting properties. -Employ arrow functions and default parameter values for concise code. \ No newline at end of file diff --git a/types/index.ts b/types/index.ts index 86f5c4a..f9f50af 100644 --- a/types/index.ts +++ b/types/index.ts @@ -1,3 +1,4 @@ +import { type } from "os"; export enum Language { JAVASCRIPT = 'javascript', @@ -15,4 +16,16 @@ export interface Feedback { criticism?: string; path?: string; error?: string; +} + +export interface ProjectConfig { + name: string, + description: string, + git: boolean, + defaultBranch: string +} + +export type GitDiff = { + file: string; + diff: string; } \ No newline at end of file