From 395ae0eff3e1324bfc4d806f812ba127256553b3 Mon Sep 17 00:00:00 2001 From: Divlo Date: Sun, 5 Jul 2020 15:48:51 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Initial=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/CONTRIBUTING.md | 108 +++ .github/logo.png | Bin 0 -> 90436 bytes .gitignore | 1 + README.md | 61 ++ challenges/hello-world/README.md | 11 + challenges/hello-world/input-output.json | 14 + challenges/hello-world/solutions/.gitkeep | 0 .../solutions/javascript-hello/README.md | 4 + .../solutions/javascript-hello/solution.js | 5 + .../solutions/python-hello/README.md | 4 + .../solutions/python-hello/solution.py | 2 + .../solutions/typescript-hello/README.md | 4 + .../solutions/typescript-hello/solution.ts | 5 + package-lock.json | 899 ++++++++++++++++++ package.json | 28 + scripts/create-challenge.ts | 84 ++ scripts/create-solution.ts | 113 +++ scripts/languages-wrapper/_languages.json | 17 + scripts/languages-wrapper/execute.js | 16 + scripts/languages-wrapper/execute.py | 13 + scripts/languages-wrapper/execute.ts | 18 + .../languages-wrapper/templates/solution.js | 5 + .../languages-wrapper/templates/solution.py | 2 + .../languages-wrapper/templates/solution.ts | 5 + scripts/templates/challenge/README.md | 11 + scripts/templates/challenge/input-output.json | 6 + scripts/templates/solutions/README.md | 3 + scripts/test.ts | 195 ++++ scripts/utils/copyDirPromise.ts | 26 + scripts/utils/deleteAllFilesExceptOne.ts | 18 + temp/.gitignore | 4 + tsconfig.json | 70 ++ 32 files changed, 1752 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/logo.png create mode 100644 .gitignore create mode 100644 README.md create mode 100644 challenges/hello-world/README.md create mode 100644 challenges/hello-world/input-output.json create mode 100644 challenges/hello-world/solutions/.gitkeep create mode 100644 challenges/hello-world/solutions/javascript-hello/README.md create mode 100644 challenges/hello-world/solutions/javascript-hello/solution.js create mode 100644 challenges/hello-world/solutions/python-hello/README.md create mode 100644 challenges/hello-world/solutions/python-hello/solution.py create mode 100644 challenges/hello-world/solutions/typescript-hello/README.md create mode 100644 challenges/hello-world/solutions/typescript-hello/solution.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scripts/create-challenge.ts create mode 100644 scripts/create-solution.ts create mode 100644 scripts/languages-wrapper/_languages.json create mode 100644 scripts/languages-wrapper/execute.js create mode 100644 scripts/languages-wrapper/execute.py create mode 100644 scripts/languages-wrapper/execute.ts create mode 100644 scripts/languages-wrapper/templates/solution.js create mode 100644 scripts/languages-wrapper/templates/solution.py create mode 100644 scripts/languages-wrapper/templates/solution.ts create mode 100644 scripts/templates/challenge/README.md create mode 100644 scripts/templates/challenge/input-output.json create mode 100644 scripts/templates/solutions/README.md create mode 100644 scripts/test.ts create mode 100644 scripts/utils/copyDirPromise.ts create mode 100644 scripts/utils/deleteAllFilesExceptOne.ts create mode 100644 temp/.gitignore create mode 100644 tsconfig.json diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..dc13074 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,108 @@ +# 💡 Contributing + +## Types of contributions : + +- [Submit a challenge instructions](challenge-instructions) +- [Share a solution for an already existing challenge](solution-for-an-already-existing-challenge) +- [Add a language available for testing the code](language-available-for-testing-the-code) +- [Correct a spelling error](spelling-error) + +## Challenge instructions + +After running the command `npm run create-challenge` (see Installation & Usage part of [README.md](../README.md)). + +You should have a new folder called the name of your challenge in [challenges](./challenges) folder. + +### Structure and purpose of each files : + +- `README.md` : explain what the solution function should do (the instructions). +- `input-output.json` : An array of possible input/output. This file allows you to test solutions. + + Example of file : + ```json + [ + { + "input": ["arg"], + "output": "Hello world arg!" + }, + { + "input": ["Divlo"], + "output": "Hello world Divlo!" + } + ] + ``` + Each object has a "input" key, an array where each item is an argument passed to the solution function when it's executed. The "output" key is the expected output with the given input. +- `solutions` folder where there are all solutions for this specific challenge. + +## Solution for an already existing challenge + +After running the command `npm run create-solution` (see Installation & Usage part of [README.md](../README.md)). + +You should have a new folder called the name of your solution in the challenge folder then you can write your solution in the solution file. +You need to name your parameters of the function (see the instruction of the challenge). + +When you feel it's right, you would need to test your code against `input-output.json` file to see if it's a valid solution.. +Run this command `npm run test [challenge-name] [solution-name]`. + +## Language available for testing the code + +Before to add a new language, you should understand : + +[/scripts/languages-wrapper](../scripts/languages-wrapper) folder contains all the files needed to execute solutions. Each programming challenge has a execute file, this execute file will be copied in the `temp` folder with the solution file. + +Steps to add a new language : + +1. Code the execute file in the appropriate language + + Algorithm of the execute file : + + - Import the solution function (same directory, ignore errors) + - Read the `./input.json` files and convert it as JSON (not plain text string) + - Execute the solution function imported with the inputs as arguments + - Create and write a new file called `./output.json`, with the output result of the solution function + + Example in javascript with node.js ([execute.js](../scripts/languages-wrapper/execute.js)) : + ```javascript + const path = require('path') + const fs = require('fs').promises + const solution = require('./solution') + + const inputPath = path.join(__dirname, 'input.json') + const outputPath = path.join(__dirname, 'output.json') + + const main = async () => { + const inputFile = await fs.readFile(inputPath) + const inputJSON = JSON.parse(inputFile) + + const result = solution.apply(null, inputJSON) + await fs.writeFile(outputPath, JSON.stringify(result)) + } + + main() + ``` + +1. Add the language in the `_languages.json` file as a new object of the array. Example for JavaScript : + ```json + { + "name": "JavaScript", + "extension": ".js", + "launch": "node" + } + ``` +1. Create a new solution file with the default basic boilerplate code in `/scripts/languages-wrapper/templates`. Example : `solution.js`: + ```js + function solution () { + + } + + module.exports = solution + ``` +1. Add the language in the language available in [README.md](../README.md) file. + + + +## Spelling error + +Correct spelling errors, in the README or CONTRIBUTING files. + +Thank you for your support! diff --git a/.github/logo.png b/.github/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..395a3b4319d33ce40d72e88e3886b25fb1160ac6 GIT binary patch literal 90436 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 literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bf8ab9a --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +

programming-challenges

+ +

+ Programming exercises and challenges to improve your algorithmic logic. +

+ +

+ Gitmoji + Licence MIT + Commit Activity + Stars +

+ programming-challenges Logo +

+ +## 📜 About + +**programming-challenges** brings together lots of programming exercises and challenges to improve your algorithmic logic. + +Each challenge has its **solutions**, its **instructions** and **input/output examples** so you can try to solve them on your own. See [challenges](./challenges) folder. + +## ✅ Programming languages available + +`npm run test` command will only work with these languages : + +- JavaScript and TypeScript (Node.js >= 12) +- Python >= 3.8 + +## 🚀 Installation & Usage (CLI) + +To easily create **new challenges instructions, solutions and test** your code, I made a **CLI tool** made with Node.js and TypeScript. + +### Requirements : + +- Node.js >= 12 + +Then you need to run `npm install` in the root folder to install needed packages, you can now use one of these commands : + +- ### `npm run create-challenge` + + Create the basic files needed for a new challenge. It will ask you some questions and you will be ready to write the instructions and `input-output.json`. Please read [CONTRIBUTING.md](./.github/CONTRIBUTING.md). + +- ### `npm run create-solution` + + Create the basic files needed for a new solution for a challenge. It will ask you some questions and you will be ready to write your solution in the available programming languages (see above). If you wish to submit to everyone your solution. Please read [CONTRIBUTING.md](./.github/CONTRIBUTING.md). + +- ### `npm run test [challenge-name] [solution-name]` + + Test if the solution is correct and display where it succeeds and fails with the inputs provided, the output of your function and the expected output. + + Example : `npm run test hello-world python-hello` + +## 💡 Contributing + +Feel free to submit your challenges, your solutions or even a simple spelling mistake. + +Everyone can contribute to the improvement of the project! The steps to contribute can be found in the [CONTRIBUTING.md](./.github/CONTRIBUTING.md) file. + +## 📄 License + +[MIT](./LICENSE) diff --git a/challenges/hello-world/README.md b/challenges/hello-world/README.md new file mode 100644 index 0000000..7e36589 --- /dev/null +++ b/challenges/hello-world/README.md @@ -0,0 +1,11 @@ +# hello-world + +Created by @Divlo at 5 July 2020. + +## Instructions : + +Your function should return Hello depending on the parameter. + +## Examples : + +See the `input-output.json` file for examples of input/output. diff --git a/challenges/hello-world/input-output.json b/challenges/hello-world/input-output.json new file mode 100644 index 0000000..f20ac45 --- /dev/null +++ b/challenges/hello-world/input-output.json @@ -0,0 +1,14 @@ +[ + { + "input": ["world"], + "output": "Hello world!" + }, + { + "input": ["everyone"], + "output": "Hello everyone!" + }, + { + "input": ["Divlo"], + "output": "Hello Divlo!" + } +] diff --git a/challenges/hello-world/solutions/.gitkeep b/challenges/hello-world/solutions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/challenges/hello-world/solutions/javascript-hello/README.md b/challenges/hello-world/solutions/javascript-hello/README.md new file mode 100644 index 0000000..e84a0de --- /dev/null +++ b/challenges/hello-world/solutions/javascript-hello/README.md @@ -0,0 +1,4 @@ +# javascript-hello - hello-world + +Programming language : JavaScript +Created by @Divlo at 5 July 2020. diff --git a/challenges/hello-world/solutions/javascript-hello/solution.js b/challenges/hello-world/solutions/javascript-hello/solution.js new file mode 100644 index 0000000..f06558f --- /dev/null +++ b/challenges/hello-world/solutions/javascript-hello/solution.js @@ -0,0 +1,5 @@ +function solution (arg) { + return 'Hello ' + arg + '!' +} + +module.exports = solution diff --git a/challenges/hello-world/solutions/python-hello/README.md b/challenges/hello-world/solutions/python-hello/README.md new file mode 100644 index 0000000..ff210d3 --- /dev/null +++ b/challenges/hello-world/solutions/python-hello/README.md @@ -0,0 +1,4 @@ +# python-hello - hello-world + +Programming language : Python +Created by @Divlo at 5 July 2020. diff --git a/challenges/hello-world/solutions/python-hello/solution.py b/challenges/hello-world/solutions/python-hello/solution.py new file mode 100644 index 0000000..945103e --- /dev/null +++ b/challenges/hello-world/solutions/python-hello/solution.py @@ -0,0 +1,2 @@ +def solution(arg): + return 'Hello ' + arg + '!' diff --git a/challenges/hello-world/solutions/typescript-hello/README.md b/challenges/hello-world/solutions/typescript-hello/README.md new file mode 100644 index 0000000..2de0cb0 --- /dev/null +++ b/challenges/hello-world/solutions/typescript-hello/README.md @@ -0,0 +1,4 @@ +# typescript-hello - hello-world + +Programming language : TypeScript +Created by @Divlo at 5 July 2020. diff --git a/challenges/hello-world/solutions/typescript-hello/solution.ts b/challenges/hello-world/solutions/typescript-hello/solution.ts new file mode 100644 index 0000000..f8c1fd1 --- /dev/null +++ b/challenges/hello-world/solutions/typescript-hello/solution.ts @@ -0,0 +1,5 @@ +function solution (arg: string) { + return 'Hello ' + arg + '!' +} + +export default solution diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4a52d93 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,899 @@ +{ + "name": "programming-challenges", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@babel/runtime-corejs3": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz", + "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/date-and-time": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/date-and-time/-/date-and-time-0.6.0.tgz", + "integrity": "sha512-gCNLSTK8SnHqNQo1MIy4fwhsufZU5zFXsJzmTdjvRsp6Xpb28G2ODFNSoZNSsf2kB9J0hPSzHCEaQqYusIwUqQ==", + "dev": true + }, + "@types/inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==", + "dev": true, + "requires": { + "@types/through": "*", + "rxjs": "^6.4.0" + } + }, + "@types/node": { + "version": "14.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", + "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", + "dev": true + }, + "@types/node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-0fRfA90FWm6KJfw6P9QGyo0HDTCmthZ7cWaBQndITlaWLTZ6njRyKwrwpzpg+n6kBXBIGKeUHEQuBx7bphGJkA==", + "dev": true + }, + "@types/table": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/table/-/table-5.0.0.tgz", + "integrity": "sha512-fQLtGLZXor264zUPWI95WNDsZ3QV43/c0lJpR/h1hhLJumXRmHNsrvBfEzW2YMhb0EWCsn4U6h82IgwsajAuTA==", + "dev": true + }, + "@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-iFNNIrEaJH1lbPiyX+O/QyxSbKxrTjdNBVZGckt+iEL9So0hdZNBL68sOfHnt2txuUD8UJXvmKv/1DkgkebgUg==", + "dev": true + }, + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "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==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, + "date-and-time": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.13.1.tgz", + "integrity": "sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw==", + "dev": true + }, + "decamelize": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", + "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", + "dev": true, + "requires": { + "xregexp": "^4.2.4" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "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==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "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==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.0.tgz", + "integrity": "sha512-K+LZp6L/6eE5swqIcVXrxl21aGDU4S50gKH0/d96OMQnSBCyGyZl/oZhbkVmdp5sBoINHd4xZvFSARh2dk6DWA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "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 + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true + }, + "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==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "pretty-ms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.0.tgz", + "integrity": "sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg==", + "dev": true, + "requires": { + "parse-ms": "^2.1.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "replace-in-file": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.1.0.tgz", + "integrity": "sha512-URzjyF3nucvejuY13HFd7O+Q6tFJRLKGHLYVvSh+LiZj3gFXzSYGnIkQflnJJulCAI2/RTZaZkpOtdVdW0EhQA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "glob": "^7.1.6", + "yargs": "^15.3.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", + "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "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 + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "ts-node": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", + "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "typescript": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", + "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.0.tgz", + "integrity": "sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^3.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9e87351 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "programming-challenges", + "private": true, + "scripts": { + "create-challenge": "ts-node ./scripts/create-challenge.ts", + "create-solution": "ts-node ./scripts/create-solution.ts", + "test": "ts-node ./scripts/test.ts" + }, + "devDependencies": { + "@types/date-and-time": "^0.6.0", + "@types/inquirer": "^6.5.0", + "@types/node": "^14.0.14", + "@types/node-emoji": "^1.8.1", + "@types/table": "^5.0.0", + "@types/validate-npm-package-name": "^3.0.0", + "chalk": "^4.1.0", + "date-and-time": "^0.13.1", + "inquirer": "^7.3.0", + "make-dir": "^3.1.0", + "node-emoji": "^1.10.0", + "pretty-ms": "^7.0.0", + "replace-in-file": "^6.1.0", + "table": "^5.4.6", + "ts-node": "^8.10.2", + "typescript": "^3.9.6", + "validate-npm-package-name": "^3.0.0" + } +} diff --git a/scripts/create-challenge.ts b/scripts/create-challenge.ts new file mode 100644 index 0000000..262475f --- /dev/null +++ b/scripts/create-challenge.ts @@ -0,0 +1,84 @@ +import path from 'path' +import * as fsWithCallbacks from 'fs' +import chalk from 'chalk' +import makeDir from 'make-dir' +import inquirer from 'inquirer' +import { replaceInFile } from 'replace-in-file' +import validateProjectName from 'validate-npm-package-name' +import copyDirPromise from './utils/copyDirPromise' +import date from 'date-and-time' +;(async () => { + const fs = fsWithCallbacks.promises + const QUESTIONS = [ + { + name: 'challengeName', + type: 'input', + message: 'Challenge name:' + }, + { + name: 'userGitHub', + type: 'input', + message: 'Your GitHub name:' + } + ] + const answers = await inquirer.prompt(QUESTIONS) + const { challengeName, userGitHub } = answers as { + [key: string]: string + } + console.log() + + if (!challengeName || challengeName === '') { + console.log(chalk.cyan('Please specify the challenge name you want to create.')) + process.exit(0) + } + + const validChallengeName = validateProjectName(challengeName) + if (!validChallengeName.validForNewPackages) { + console.log(` + Invalid challenge name: ${chalk.red(challengeName)} + ${validChallengeName.errors != undefined && + validChallengeName.errors[0]} + `) + process.exit(0) + } + + const challengePath = path.resolve( + __dirname, + '..', + 'challenges', + challengeName + ) + const templatePath = path.resolve(__dirname, 'templates', 'challenge') + + // Challenge valid ? + if (fsWithCallbacks.existsSync(challengePath)) { + console.log(`The challenge already exists: ${chalk.red(challengeName)}`) + process.exit(0) + } + + const createdChallengeTemplatePath = await makeDir(challengePath) + const solutionsFolderPath = path.join(createdChallengeTemplatePath, 'solutions') + await copyDirPromise(templatePath, createdChallengeTemplatePath) + await makeDir(solutionsFolderPath) + await fs.writeFile(path.join(solutionsFolderPath, '.gitkeep'), '') + + // Replace {{ challengeName }} in README.md + const readmePath = path.join(createdChallengeTemplatePath, 'README.md') + await replaceInFile({ + files: [readmePath], + from: /{{ challengeName }}/g, + to: challengeName + }) + + // Replace {{ challengeInfo }} in README.md + await replaceInFile({ + files: [readmePath], + from: /{{ challengeInfo }}/g, + to: `Created${(userGitHub !== '') ? ` by @${userGitHub}` : ''} at ${date.format(new Date(), 'D MMMM Y', true)}.` + }) + + console.log(` + ${chalk.green('Success:')} "${challengeName}" challenge created. + ${chalk.cyan('You can now edit README.md and input-output.json files.')} + `) +})() diff --git a/scripts/create-solution.ts b/scripts/create-solution.ts new file mode 100644 index 0000000..88a7874 --- /dev/null +++ b/scripts/create-solution.ts @@ -0,0 +1,113 @@ +import path from 'path' +import * as fsWithCallbacks from 'fs' +import chalk from 'chalk' +import inquirer from 'inquirer' +import { replaceInFile } from 'replace-in-file' +import makeDir from 'make-dir' +import date from 'date-and-time' +import validateProjectName from 'validate-npm-package-name' +import copyDirPromise from './utils/copyDirPromise' +;(async () => { + const fs = fsWithCallbacks.promises + const challengesPath = path.resolve(__dirname, '..', 'challenges') + const challengesAvailable = await fs.readdir(challengesPath) + const languagesAvailable: { + name: string + extension: string + launch: string + }[] = require('./languages-wrapper/_languages.json') + + const QUESTIONS = [ + { + name: 'challengeName', + type: 'list', + message: 'Select a challenge:', + choices: challengesAvailable + }, + { + name: 'programmingLanguage', + type: 'list', + message: 'Select a programming language:', + choices: languagesAvailable.map(language => ({ name: language.name, value: language })) + }, + { + name: 'solutionName', + type: 'input', + message: 'Solution name:' + }, + { + name: 'userGitHub', + type: 'input', + message: 'Your GitHub name:' + } + ] + + const answers = await inquirer.prompt(QUESTIONS) + console.log() + const { challengeName, solutionName, userGitHub } = answers as { + [key: string]: string + } + const { programmingLanguage } = answers as { + programmingLanguage: { + extension: string + name: string + } + } + + const validSolutionName = validateProjectName(solutionName) + if (!validSolutionName.validForNewPackages) { + console.log(` + Invalid solution name: ${chalk.red(solutionName)} + ${validSolutionName.errors != undefined && + validSolutionName.errors[0]} + `) + process.exit(0) + } + + const solutionPath = path.resolve( + __dirname, + '..', + 'challenges', + challengeName, + 'solutions', + solutionName + ) + const templatePath = path.resolve(__dirname, 'templates', 'solutions') + const templateSolutionPath = path.resolve(__dirname, 'languages-wrapper', 'templates') + + // Solution valid ? + if (fsWithCallbacks.existsSync(solutionPath)) { + console.log(`The solution already exists: ${chalk.red(solutionName)}`) + process.exit(0) + } + + const createdSolutionTemplatePath = await makeDir(solutionPath) + await copyDirPromise(templatePath, createdSolutionTemplatePath) + + const languageSolutionTemplate = path.join(templateSolutionPath, `solution${programmingLanguage.extension}`) + await fs.copyFile(languageSolutionTemplate, path.join(createdSolutionTemplatePath, `solution${programmingLanguage.extension}`)) + + // Replace {{ solutionName }} in README.md + const readmePath = path.join(createdSolutionTemplatePath, 'README.md') + await replaceInFile({ + files: [readmePath], + from: /{{ solutionName }}/g, + to: `${solutionName} - ${challengeName}` + }) + + // Replace {{ solutionInfo }} in README.md + const createdByString = `Created${(userGitHub !== '') ? ` by @${userGitHub}` : ''} at ${date.format(new Date(), 'D MMMM Y', true)}.` + await replaceInFile({ + files: [readmePath], + from: /{{ solutionInfo }}/g, + to: 'Programming language : ' + programmingLanguage.name + '\n' + createdByString + }) + + console.log(` + ${chalk.green('Success:')} "${solutionName}" created. + ${chalk.cyan(`Edit your solution${programmingLanguage.extension} file and try to solve "${challengeName}" challenge (see README.md).`)} + + Don't forget to test your solution attempt : + ${chalk.green(`npm run test ${challengeName} ${solutionName}`)} + `) +})() diff --git a/scripts/languages-wrapper/_languages.json b/scripts/languages-wrapper/_languages.json new file mode 100644 index 0000000..ef5f9bc --- /dev/null +++ b/scripts/languages-wrapper/_languages.json @@ -0,0 +1,17 @@ +[ + { + "name": "Python", + "extension": ".py", + "launch": "python" + }, + { + "name": "JavaScript", + "extension": ".js", + "launch": "node" + }, + { + "name": "TypeScript", + "extension": ".ts", + "launch": "ts-node" + } +] diff --git a/scripts/languages-wrapper/execute.js b/scripts/languages-wrapper/execute.js new file mode 100644 index 0000000..70892af --- /dev/null +++ b/scripts/languages-wrapper/execute.js @@ -0,0 +1,16 @@ +const path = require('path') +const fs = require('fs').promises +const solution = require('./solution') + +const inputPath = path.join(__dirname, 'input.json') +const outputPath = path.join(__dirname, 'output.json') + +const main = async () => { + const inputFile = await fs.readFile(inputPath) + const inputJSON = JSON.parse(inputFile) + + const result = solution.apply(null, inputJSON) + await fs.writeFile(outputPath, JSON.stringify(result)) +} + +main() diff --git a/scripts/languages-wrapper/execute.py b/scripts/languages-wrapper/execute.py new file mode 100644 index 0000000..a8ff28b --- /dev/null +++ b/scripts/languages-wrapper/execute.py @@ -0,0 +1,13 @@ +import os +import json +from solution import solution + +current_directory = os.path.dirname(__file__) +input_path = os.path.join(current_directory, "input.json") +output_path = os.path.join(current_directory, "output.json") + +with open(input_path, "r") as file_content: + input_json = json.load(file_content) + +with open(output_path, "w") as file_content: + json.dump(solution(*input_json), file_content) diff --git a/scripts/languages-wrapper/execute.ts b/scripts/languages-wrapper/execute.ts new file mode 100644 index 0000000..f60d46a --- /dev/null +++ b/scripts/languages-wrapper/execute.ts @@ -0,0 +1,18 @@ +import path from 'path' +import * as fsWithCallbacks from 'fs' +// @ts-ignore +import solution from './solution' + +const fs = fsWithCallbacks.promises +const inputPath = path.join(__dirname, 'input.json') +const outputPath = path.join(__dirname, 'output.json') + +const main = async () => { + const inputFile = await fs.readFile(inputPath) + const inputJSON = JSON.parse(inputFile.toString()) + + const result = solution.apply(null, inputJSON) + await fs.writeFile(outputPath, JSON.stringify(result)) +} + +main() diff --git a/scripts/languages-wrapper/templates/solution.js b/scripts/languages-wrapper/templates/solution.js new file mode 100644 index 0000000..47ed582 --- /dev/null +++ b/scripts/languages-wrapper/templates/solution.js @@ -0,0 +1,5 @@ +function solution () { + +} + +module.exports = solution diff --git a/scripts/languages-wrapper/templates/solution.py b/scripts/languages-wrapper/templates/solution.py new file mode 100644 index 0000000..4d6454c --- /dev/null +++ b/scripts/languages-wrapper/templates/solution.py @@ -0,0 +1,2 @@ +def solution(): + pass diff --git a/scripts/languages-wrapper/templates/solution.ts b/scripts/languages-wrapper/templates/solution.ts new file mode 100644 index 0000000..3482076 --- /dev/null +++ b/scripts/languages-wrapper/templates/solution.ts @@ -0,0 +1,5 @@ +function solution () { + +} + +export default solution diff --git a/scripts/templates/challenge/README.md b/scripts/templates/challenge/README.md new file mode 100644 index 0000000..b66535e --- /dev/null +++ b/scripts/templates/challenge/README.md @@ -0,0 +1,11 @@ +# {{ challengeName }} + +{{ challengeInfo }} + +## Instructions : + +Description of the challenge... + +## Examples : + +See the `input-output.json` file for examples of input/output. diff --git a/scripts/templates/challenge/input-output.json b/scripts/templates/challenge/input-output.json new file mode 100644 index 0000000..7d7ec61 --- /dev/null +++ b/scripts/templates/challenge/input-output.json @@ -0,0 +1,6 @@ +[ + { + "input": [], + "output": null + } +] diff --git a/scripts/templates/solutions/README.md b/scripts/templates/solutions/README.md new file mode 100644 index 0000000..6590f87 --- /dev/null +++ b/scripts/templates/solutions/README.md @@ -0,0 +1,3 @@ +# {{ solutionName }} + +{{ solutionInfo }} diff --git a/scripts/test.ts b/scripts/test.ts new file mode 100644 index 0000000..1207eff --- /dev/null +++ b/scripts/test.ts @@ -0,0 +1,195 @@ +import util from 'util' +import path from 'path' +import * as fsWithCallbacks from 'fs' +import childProcess from 'child_process' +import { performance } from 'perf_hooks' +import chalk from 'chalk' +import deleteAllFilesExceptOne from './utils/deleteAllFilesExceptOne' +import emoji from 'node-emoji' +import prettyMilliseconds from 'pretty-ms' +import { table } from 'table' +;(async () => { + const fs = fsWithCallbacks.promises + const exec = util.promisify(childProcess.exec) + const args = process.argv.slice(2) + const [challengeName, solutionName] = args + + if (!challengeName || !solutionName) { + console.log(` + Please specify the challenge and solution name: + ${chalk.cyan(`npm run test [challenge-name] [solution-name]`)} + + For example: + ${chalk.cyan('npm run test hello-world python-hello')} + `) + process.exit(0) + } + + const challengePath = path.resolve( + __dirname, + '..', + 'challenges', + challengeName + ) + const solutionFolderPath = path.resolve( + challengePath, + 'solutions', + solutionName + ) + + // Challenge valid ? + try { + await fs.access(challengePath) + } catch { + console.log(`The challenge was not found: ${chalk.red(challengeName)}`) + process.exit(0) + } + + // Solution valid ? + try { + await fs.access(solutionFolderPath) + } catch { + console.log(`The solution was not found: ${chalk.red(solutionName)}`) + process.exit(0) + } + + // Determinate the language to execute + const solutionFilesName = await fs.readdir(solutionFolderPath) + let solutionFilePath + for (const solutionFileName of solutionFilesName) { + const fileName = solutionFileName + .split('.') + .slice(0, -1) + .join('.') + if (fileName === 'solution') { + solutionFilePath = solutionFileName + break + } + } + if (!solutionFilePath) { + console.log(`The ${chalk.red('solution')} file was not found.`) + process.exit(0) + } + const languages: { + name: string + extension: string + launch: string + }[] = require('./languages-wrapper/_languages.json') + const extensionSolution = path.extname(solutionFilePath) + const languageToExecute = languages.find( + language => language.extension === extensionSolution + ) + if (!languageToExecute) { + console.log(`Sadly, this ${chalk.red('language')} is not supported yet.`) + process.exit(0) + } + + // Copy 'solution' and 'execute' files in temp + const inputOutputJSON: { input: any[]; output: any }[] = require(path.join( + __dirname, + '..', + 'challenges', + challengeName, + 'input-output.json' + )) + const tempPath = path.join(__dirname, '..', 'temp') + const executeFile = `execute${languageToExecute.extension}` + const executeLanguagePath = path.resolve( + __dirname, + 'languages-wrapper', + executeFile + ) + const executeLanguageTempPath = path.join(tempPath, executeFile) + const inputPath = path.join(tempPath, 'input.json') + const outputPath = path.join(tempPath, 'output.json') + await fs.copyFile( + path.resolve(solutionFolderPath, solutionFilePath), + path.join(tempPath, solutionFilePath) + ) + await fs.copyFile(executeLanguagePath, executeLanguageTempPath) + + // Console.log & Tests + const totalCorrect = { + total: 0, + correct: 0 + } + const tableResult = [ + [ + chalk.cyan('Result'), + chalk.cyan('Input'), + chalk.cyan('Output'), + chalk.cyan('Expected output') + ] + ] + const startTest = performance.now() + + // Loop I/O + for (const { input, output } of inputOutputJSON) { + // Write input.json + const inputStringify = JSON.stringify(input) + await fs.writeFile(inputPath, inputStringify) + + // Execute script (create output.json) + try { + await exec(`${languageToExecute.launch} ${executeLanguageTempPath}`) + } catch (error) { + console.log(chalk.bgRedBright.black(error.stderr)) + await deleteAllFilesExceptOne(tempPath, '.gitignore') + process.exit(0) + } + + // Read output.json + const data = await fs.readFile(outputPath) + const outputJSON = JSON.parse(data.toString()) + + // Tests + totalCorrect.total += 1 + const outputJSONStringify = JSON.stringify(outputJSON) + const outputStringify = JSON.stringify(output) + const isCorrect = outputJSONStringify === outputStringify + + if (isCorrect) { + tableResult.push([ + emoji.get('white_check_mark'), + inputStringify, + outputJSONStringify, + outputStringify + ]) + totalCorrect.correct += 1 + } else { + tableResult.push([ + emoji.get('x'), + inputStringify, + outputJSONStringify, + outputStringify + ]) + } + + // Delete I/O file + await fs.unlink(inputPath) + await fs.unlink(outputPath) + } + + const endTest = performance.now() + + console.log( + table(tableResult, { + columns: { + 0: { width: 6, alignment: 'center' }, + 1: { width: 20, wrapWord: true }, + 2: { width: 30, wrapWord: true }, + 3: { width: 30, wrapWord: true } + } + }) + ) + console.log(` +Challenge : ${challengeName} +Solution : ${solutionName} +Tests : ${chalk.green(`${totalCorrect.correct} passed`)}, ${ + totalCorrect.total + } total +Time : ${chalk.yellow(prettyMilliseconds(endTest - startTest))} +`) + + await deleteAllFilesExceptOne(tempPath, '.gitignore') +})() diff --git a/scripts/utils/copyDirPromise.ts b/scripts/utils/copyDirPromise.ts new file mode 100644 index 0000000..993cf43 --- /dev/null +++ b/scripts/utils/copyDirPromise.ts @@ -0,0 +1,26 @@ +import fs from 'fs' +import path from 'path' + +function copyDirPromise (source: string, destination: string) { + return new Promise(next => { + const filesToCreate = fs.readdirSync(source) + filesToCreate.forEach(async file => { + const originalFilePath = path.join(source, file) + const stats = fs.statSync(originalFilePath) + if (stats.isFile()) { + if (file === '.npmignore') file = '.gitignore' + const writePath = path.join(destination, file) + fs.copyFileSync(originalFilePath, writePath) + } else if (stats.isDirectory()) { + fs.mkdirSync(path.join(destination, file)) + await copyDirPromise( + path.join(source, file), + path.join(destination, file) + ) + } + }) + next() + }) +} + +export default copyDirPromise diff --git a/scripts/utils/deleteAllFilesExceptOne.ts b/scripts/utils/deleteAllFilesExceptOne.ts new file mode 100644 index 0000000..48956ae --- /dev/null +++ b/scripts/utils/deleteAllFilesExceptOne.ts @@ -0,0 +1,18 @@ +import path from 'path' +import * as fsWithCallbacks from 'fs' +const fs = fsWithCallbacks.promises + +async function deleteAllFilesExceptOne (directoryPath: string, fileNameToNotDelete: string) { + const fileNames = await fs.readdir(path.resolve(directoryPath)) + for (const name of fileNames) { + const fileNamePath = path.resolve(directoryPath, name) + const stats = await fs.stat(fileNamePath) + if (stats.isDirectory()) { + await fs.rmdir(fileNamePath, { recursive: true }) + } else if (name !== fileNameToNotDelete) { + await fs.unlink(fileNamePath) + } + } +} + +export default deleteAllFilesExceptOne diff --git a/temp/.gitignore b/temp/.gitignore new file mode 100644 index 0000000..86d0cb2 --- /dev/null +++ b/temp/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9d577a3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,70 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "es2018", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "resolveJsonModule": true, + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + + /* Advanced Options */ + "skipLibCheck": true, /* Skip type checking of declaration files. */ + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + } +}