├── .all-contributorsrc ├── .github └── workflows │ └── publish.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── bin ├── handler.js ├── index.js └── utils.js ├── lib ├── handler.ts ├── index.ts └── utils.ts ├── logo.svg ├── package-lock.json ├── package.json ├── site ├── Bold.otf ├── api.json ├── index.html └── style.css └── tsconfig.json /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "thedarkrai07", 10 | "name": "Darkrai.07", 11 | "avatar_url": "https://avatars.githubusercontent.com/u/105098416?v=4", 12 | "profile": "https://github.com/thedarkrai07", 13 | "contributions": [ 14 | "code" 15 | ] 16 | } 17 | ], 18 | "contributorsPerLine": 7, 19 | "projectName": "cli", 20 | "projectOwner": "create-anchor-app", 21 | "repoType": "github", 22 | "repoHost": "https://github.com", 23 | "skipCi": true 24 | } 25 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: deploy to prod 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | 7 | jobs: 8 | deploy: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v2 14 | 15 | - name: Use Node 16 16 | uses: actions/setup-node@v1 17 | with: 18 | node-version: 16.x 19 | 20 | - name: Install vercel 21 | run: npm i vercel -g 22 | 23 | 24 | 25 | - name: Build 26 | run: npm install && npm run build 27 | 28 | 29 | - name: Deploy API 30 | run: vercel --prod --token $VERCEL_TOKEN 31 | env: 32 | VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} 33 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG }} 34 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJ }} 35 | 36 | 37 | - name: Version 38 | uses: "phips28/gh-action-bump-version@master" 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} 41 | 42 | - name: Publish 43 | run: echo "//registry.npmjs.org/:_authToken=$NPM_AUTH_TOKEN" > ~/.npmrc && npm publish --access public 44 | env: 45 | NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 46 | 47 | publish-gpr: 48 | needs: deploy 49 | runs-on: ubuntu-latest 50 | permissions: 51 | contents: read 52 | packages: write 53 | steps: 54 | - uses: actions/checkout@v3 55 | - uses: actions/setup-node@v3 56 | with: 57 | node-version: 16 58 | registry-url: https://npm.pkg.github.com/ 59 | - run: npm install && npm run build 60 | - run: npm publish 61 | env: 62 | NODE_AUTH_TOKEN: ${{secrets.GH_TOKEN}} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .vercel 4 | bin/api.json -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2022 Scott Chacon and others 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Create Anchor App 2 | 3 | [![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) 4 | 5 |
6 | 7 | Logo 8 | Quickly create an anchor program from templates and setup anchor dev environment. 9 |
10 | 11 | ## Example 12 | Logo 13 | 14 | ## Installation 15 | ``` 16 | npm i -g @create-anchor-app/cli 17 | ``` 18 | 19 | ## Usage 20 | ``` 21 | create-anchor-app 22 | ``` 23 | Use without installing 24 | ``` 25 | npx @create-anchor-app/cli 26 | ``` 27 | 28 | ## Feature roadmap 29 | - [x] Command to generate anchor contracts 30 | - [ ] CI for Anchor projects 31 | - [ ] Security.txt generation 32 | - [ ] local ledger directory 33 | 34 | - [ ] local wallet generation and directory 35 | 36 | 37 | ## Contributors ✨ 38 | 39 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |

Darkrai.07

💻
49 | 50 | 51 | 52 | 53 | 54 | 55 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 56 | -------------------------------------------------------------------------------- /bin/handler.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 13 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (_) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | var __importDefault = (this && this.__importDefault) || function (mod) { 39 | return (mod && mod.__esModule) ? mod : { "default": mod }; 40 | }; 41 | Object.defineProperty(exports, "__esModule", { value: true }); 42 | exports.handler = void 0; 43 | var path_1 = __importDefault(require("path")); 44 | var child_process_1 = require("child_process"); 45 | var inquirer_1 = __importDefault(require("inquirer")); 46 | var chalk_1 = __importDefault(require("chalk")); 47 | var fs_1 = __importDefault(require("fs")); 48 | var node_fetch_1 = __importDefault(require("node-fetch")); 49 | var node_stream_zip_1 = __importDefault(require("node-stream-zip")); 50 | function handler(template, name, setupCI) { 51 | return __awaiter(this, void 0, void 0, function () { 52 | var examples; 53 | var _this = this; 54 | return __generator(this, function (_a) { 55 | console.clear(); 56 | examples = require(path_1.default.resolve(__dirname, "api.json")); 57 | console.log(chalk_1.default.gray("Template: "), chalk_1.default.green(template)); 58 | console.log(chalk_1.default.gray("App name: "), chalk_1.default.green(name)); 59 | console.log(chalk_1.default.gray("Setup CI: "), chalk_1.default.green(setupCI ? 'Yes' : 'No')); 60 | inquirer_1.default 61 | .prompt([ 62 | { 63 | type: "confirm", 64 | name: "confirm", 65 | message: "Proceed?", 66 | default: true, 67 | }, 68 | ]) 69 | .then(function (answers) { return __awaiter(_this, void 0, void 0, function () { 70 | var start, pathname, ex, startCommand, file_1, fileStream_1; 71 | var _this = this; 72 | return __generator(this, function (_a) { 73 | switch (_a.label) { 74 | case 0: 75 | if (!answers.confirm) return [3 /*break*/, 7]; 76 | console.clear(); 77 | start = new Date(); 78 | pathname = "".concat(path_1.default.resolve("./"), "/").concat(name); 79 | if (!fs_1.default.existsSync(pathname)) return [3 /*break*/, 2]; 80 | console.log(chalk_1.default.gray("Directory already exists: ".concat(pathname))); 81 | return [4 /*yield*/, inquirer_1.default 82 | .prompt([ 83 | { 84 | type: "confirm", 85 | name: "confirm", 86 | message: "Overwrite?", 87 | default: false, 88 | }, 89 | ]) 90 | .then(function (answers) { return __awaiter(_this, void 0, void 0, function () { 91 | return __generator(this, function (_a) { 92 | if (!answers.confirm) { 93 | process.exit(1); 94 | } 95 | return [2 /*return*/]; 96 | }); 97 | }); })]; 98 | case 1: 99 | _a.sent(); 100 | _a.label = 2; 101 | case 2: 102 | ex = examples[template]; 103 | console.log(chalk_1.default.gray("Setting up...")); 104 | console.log(chalk_1.default.gray("Cloning repo...")); 105 | return [4 /*yield*/, download(ex.repo, pathname, name)]; 106 | case 3: 107 | _a.sent(); 108 | console.clear(); 109 | console.log(chalk_1.default.gray("Setting up...")); 110 | console.log(chalk_1.default.gray("Installing Dependencies...")); 111 | (0, child_process_1.execSync)("cd ".concat(pathname, " && ").concat(ex.install, " --force && git init"), { 112 | stdio: [1], 113 | }); 114 | console.clear(); 115 | console.log("Done in ".concat((new Date().getTime() - start.getTime()) / 1000, "s \u2728 ")); 116 | startCommand = ex.run; 117 | if (ex.guide !== undefined && ex.guide !== "") { 118 | console.log("Find accompanying tutorial at ".concat(chalk_1.default.green(ex.guide))); 119 | } 120 | if (ex.docs !== undefined && ex.docs !== "") { 121 | console.log("Check out docs at ".concat(chalk_1.default.green(ex.docs))); 122 | } 123 | if (startCommand !== undefined && startCommand !== "") { 124 | console.log("run `" + 125 | chalk_1.default.green("cd ".concat(name).concat(startCommand ? " && " + startCommand : "")) + 126 | "` to get started"); 127 | } 128 | if (!setupCI) return [3 /*break*/, 6]; 129 | (0, child_process_1.execSync)("mkdir -p ".concat(pathname, "/.github/workflows"), { stdio: [1] }); 130 | console.log(chalk_1.default.gray("Setting up...")); 131 | console.log(chalk_1.default.grey('Setting up CI for the project...')); 132 | return [4 /*yield*/, (0, node_fetch_1.default)('https://gist.githubusercontent.com/anoushk1234/0f86460f08821bdbbdb03a3f56681928/raw/995c7d1a221546cadef7fa47131eef1a57001706/tests.yml')]; 133 | case 4: 134 | file_1 = _a.sent(); 135 | fileStream_1 = fs_1.default.createWriteStream("".concat(pathname, "/.github/workflows/ci.yml")); 136 | return [4 /*yield*/, new Promise(function (resolve, reject) { 137 | file_1.body.pipe(fileStream_1); 138 | file_1.body.on("error", reject); 139 | fileStream_1.on("finish", resolve); 140 | })]; 141 | case 5: 142 | _a.sent(); 143 | _a.label = 6; 144 | case 6: return [3 /*break*/, 8]; 145 | case 7: 146 | console.log(chalk_1.default.red("Operation cancelled by user")); 147 | _a.label = 8; 148 | case 8: return [2 /*return*/]; 149 | } 150 | }); 151 | }); }) 152 | .catch(function (err) { 153 | console.clear(); 154 | if (err.command) { 155 | console.log("".concat(chalk_1.default.cyan(err.command), " has failed.")); 156 | } 157 | else { 158 | console.log(chalk_1.default.red("Unexpected error. Please report it as a bug:")); 159 | console.log(err.message); 160 | } 161 | }); 162 | return [2 /*return*/]; 163 | }); 164 | }); 165 | } 166 | exports.handler = handler; 167 | function download(repo, path, name) { 168 | return __awaiter(this, void 0, void 0, function () { 169 | var branch, res, fileStream, zip; 170 | return __generator(this, function (_a) { 171 | switch (_a.label) { 172 | case 0: 173 | branch = "master"; 174 | return [4 /*yield*/, (0, node_fetch_1.default)("https://codeload.github.com/create-anchor-app/".concat(repo, "/zip/refs/heads/master"))]; 175 | case 1: 176 | res = (_a.sent()); 177 | if (!(res.status !== 200)) return [3 /*break*/, 3]; 178 | return [4 /*yield*/, (0, node_fetch_1.default)("https://codeload.github.com/create-anchor-app/".concat(repo, "/zip/refs/heads/main"))]; 179 | case 2: 180 | res = (_a.sent()); 181 | branch = "main"; 182 | _a.label = 3; 183 | case 3: 184 | console.log(chalk_1.default.gray(res.statusText)); 185 | fileStream = fs_1.default.createWriteStream("".concat(__dirname, "/").concat(name, ".zip")); 186 | return [4 /*yield*/, new Promise(function (resolve, reject) { 187 | res.body.pipe(fileStream); 188 | res.body.on("error", reject); 189 | fileStream.on("finish", resolve); 190 | })]; 191 | case 4: 192 | _a.sent(); 193 | fs_1.default.mkdirSync(path); 194 | zip = new node_stream_zip_1.default.async({ file: "".concat(__dirname, "/").concat(name, ".zip") }); 195 | return [4 /*yield*/, zip.extract("".concat(repo, "-").concat(branch), path)]; 196 | case 5: 197 | _a.sent(); 198 | console.log(chalk_1.default.gray("Done")); 199 | return [4 /*yield*/, zip.close()]; 200 | case 6: 201 | _a.sent(); 202 | fs_1.default.unlinkSync("".concat(__dirname, "/").concat(name, ".zip")); 203 | return [2 /*return*/]; 204 | } 205 | }); 206 | }); 207 | } 208 | -------------------------------------------------------------------------------- /bin/index.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | "use strict"; 3 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 4 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 5 | return new (P || (P = Promise))(function (resolve, reject) { 6 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 7 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 8 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 9 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 10 | }); 11 | }; 12 | var __generator = (this && this.__generator) || function (thisArg, body) { 13 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 14 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 15 | function verb(n) { return function (v) { return step([n, v]); }; } 16 | function step(op) { 17 | if (f) throw new TypeError("Generator is already executing."); 18 | while (_) try { 19 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 20 | if (y = 0, t) op = [op[0] & 2, t.value]; 21 | switch (op[0]) { 22 | case 0: case 1: t = op; break; 23 | case 4: _.label++; return { value: op[1], done: false }; 24 | case 5: _.label++; y = op[1]; op = [0]; continue; 25 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 26 | default: 27 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 28 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 29 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 30 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 31 | if (t[2]) _.ops.pop(); 32 | _.trys.pop(); continue; 33 | } 34 | op = body.call(thisArg, _); 35 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 36 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 37 | } 38 | }; 39 | var __importDefault = (this && this.__importDefault) || function (mod) { 40 | return (mod && mod.__esModule) ? mod : { "default": mod }; 41 | }; 42 | Object.defineProperty(exports, "__esModule", { value: true }); 43 | var fs_1 = require("fs"); 44 | var node_fetch_1 = __importDefault(require("node-fetch")); 45 | var handler_1 = require("./handler"); 46 | var path_1 = __importDefault(require("path")); 47 | var chalk_1 = __importDefault(require("chalk")); 48 | var utils_1 = require("./utils"); 49 | var args = process.argv.slice(2); 50 | var supportedCommands = ["-v", "--version", "-h", "--help"]; 51 | console.clear(); 52 | (function () { return __awaiter(void 0, void 0, void 0, function () { 53 | var filePath, res, _a, _b, _c, examples, exampleName, _d, answer, _e, setupCI, _f, err_1; 54 | return __generator(this, function (_g) { 55 | switch (_g.label) { 56 | case 0: 57 | _g.trys.push([0, 11, , 12]); 58 | filePath = path_1.default.resolve(__dirname, "api.json"); 59 | return [4 /*yield*/, (0, node_fetch_1.default)("https://create-anchor-app.vercel.app/api.json")]; 60 | case 1: 61 | res = _g.sent(); 62 | _b = (_a = fs_1.promises).writeFile; 63 | _c = [filePath]; 64 | return [4 /*yield*/, res.text()]; 65 | case 2: return [4 /*yield*/, _b.apply(_a, _c.concat([_g.sent()]))]; 66 | case 3: 67 | _g.sent(); 68 | examples = require(filePath); 69 | if (args.length) { 70 | if (supportedCommands.includes(args[0])) { 71 | (0, utils_1.flags)(args[0]); 72 | } 73 | if (!Object.keys(examples).includes(args[0])) { 74 | (0, utils_1.flags)(args[0]); 75 | } 76 | if (args.length > 2 && args.filter(function (x) { return !supportedCommands.includes(x); }).length > 0) { 77 | console.log(chalk_1.default.red("Unexpected flag(s) :", args.join(" "))); 78 | process.exit(1); 79 | } 80 | } 81 | _d = args[0]; 82 | if (_d) return [3 /*break*/, 5]; 83 | return [4 /*yield*/, (0, utils_1.whatAreYouBuilding)(examples)]; 84 | case 4: 85 | _d = (_g.sent()); 86 | _g.label = 5; 87 | case 5: 88 | exampleName = _d; 89 | _e = args[1]; 90 | if (_e) return [3 /*break*/, 7]; 91 | return [4 /*yield*/, (0, utils_1.chooseName)()]; 92 | case 6: 93 | _e = (_g.sent()); 94 | _g.label = 7; 95 | case 7: 96 | answer = _e; 97 | _f = args[2]; 98 | if (_f) return [3 /*break*/, 9]; 99 | return [4 /*yield*/, (0, utils_1.shouldSetupCI)()]; 100 | case 8: 101 | _f = (_g.sent()); 102 | _g.label = 9; 103 | case 9: 104 | setupCI = _f; 105 | return [4 /*yield*/, (0, handler_1.handler)(exampleName, answer, setupCI)]; 106 | case 10: 107 | _g.sent(); 108 | return [3 /*break*/, 12]; 109 | case 11: 110 | err_1 = _g.sent(); 111 | console.log(chalk_1.default.red("Error fetching latest examples: ".concat(err_1.message))); 112 | process.exit(1); 113 | return [3 /*break*/, 12]; 114 | case 12: 115 | ; 116 | return [2 /*return*/]; 117 | } 118 | }); 119 | }); })(); 120 | -------------------------------------------------------------------------------- /bin/utils.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 3 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 4 | return new (P || (P = Promise))(function (resolve, reject) { 5 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 6 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 7 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 8 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 9 | }); 10 | }; 11 | var __generator = (this && this.__generator) || function (thisArg, body) { 12 | var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; 13 | return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; 14 | function verb(n) { return function (v) { return step([n, v]); }; } 15 | function step(op) { 16 | if (f) throw new TypeError("Generator is already executing."); 17 | while (_) try { 18 | if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; 19 | if (y = 0, t) op = [op[0] & 2, t.value]; 20 | switch (op[0]) { 21 | case 0: case 1: t = op; break; 22 | case 4: _.label++; return { value: op[1], done: false }; 23 | case 5: _.label++; y = op[1]; op = [0]; continue; 24 | case 7: op = _.ops.pop(); _.trys.pop(); continue; 25 | default: 26 | if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } 27 | if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } 28 | if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } 29 | if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } 30 | if (t[2]) _.ops.pop(); 31 | _.trys.pop(); continue; 32 | } 33 | op = body.call(thisArg, _); 34 | } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } 35 | if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; 36 | } 37 | }; 38 | var __importDefault = (this && this.__importDefault) || function (mod) { 39 | return (mod && mod.__esModule) ? mod : { "default": mod }; 40 | }; 41 | Object.defineProperty(exports, "__esModule", { value: true }); 42 | exports.shouldSetupCI = exports.whatAreYouBuilding = exports.chooseName = exports.flags = void 0; 43 | var chalk_1 = __importDefault(require("chalk")); 44 | var inquirer_1 = __importDefault(require("inquirer")); 45 | var project_name_generator_1 = __importDefault(require("project-name-generator")); 46 | var path_1 = __importDefault(require("path")); 47 | function flags(flag) { 48 | switch (flag) { 49 | case "-h" || "--help": 50 | console.log("Please visit ".concat(chalk_1.default.cyan("https://github.com/create-anchor-app/cli#readme"), " to know more about the usage of this CLI.")); 51 | break; 52 | case "-v" || "--version": 53 | console.log("".concat(chalk_1.default.cyan("create-anchor-app"), " ").concat(chalk_1.default.green(require(path_1.default.resolve(__dirname, "../package.json")).version))); 54 | break; 55 | default: 56 | console.log(chalk_1.default.red("Unexpected flag or project type:", flag)); 57 | } 58 | process.exit(1); 59 | } 60 | exports.flags = flags; 61 | function chooseName() { 62 | return __awaiter(this, void 0, void 0, function () { 63 | var answer; 64 | return __generator(this, function (_a) { 65 | switch (_a.label) { 66 | case 0: return [4 /*yield*/, inquirer_1.default 67 | .prompt([ 68 | { 69 | type: "input", 70 | name: "name", 71 | message: "Name of the app?", 72 | default: (0, project_name_generator_1.default)().dashed, 73 | }, 74 | ]).catch(function (err) { 75 | console.log(chalk_1.default.red("Unexpected error:", err)); 76 | process.exit(1); 77 | })]; 78 | case 1: 79 | answer = _a.sent(); 80 | return [2 /*return*/, answer.name]; 81 | } 82 | }); 83 | }); 84 | } 85 | exports.chooseName = chooseName; 86 | var whatAreYouBuilding = function (examples) { return __awaiter(void 0, void 0, void 0, function () { 87 | var answer; 88 | return __generator(this, function (_a) { 89 | switch (_a.label) { 90 | case 0: return [4 /*yield*/, inquirer_1.default 91 | .prompt([ 92 | { 93 | type: "list", 94 | name: "example", 95 | message: "What are you building today?", 96 | choices: Object.keys(examples), 97 | }, 98 | ]).catch(function (err) { 99 | console.log(chalk_1.default.red("Unexpected error:", err)); 100 | process.exit(1); 101 | })]; 102 | case 1: 103 | answer = _a.sent(); 104 | return [2 /*return*/, answer.example]; 105 | } 106 | }); 107 | }); }; 108 | exports.whatAreYouBuilding = whatAreYouBuilding; 109 | var shouldSetupCI = function () { return __awaiter(void 0, void 0, void 0, function () { 110 | var answer; 111 | return __generator(this, function (_a) { 112 | switch (_a.label) { 113 | case 0: return [4 /*yield*/, inquirer_1.default 114 | .prompt([ 115 | { 116 | type: "confirm", 117 | name: "example", 118 | message: "Do you want to setup CI?", 119 | default: true, 120 | }, 121 | ]).catch(function (err) { 122 | console.log(chalk_1.default.red("Unexpected error:", err)); 123 | process.exit(1); 124 | })]; 125 | case 1: 126 | answer = _a.sent(); 127 | return [2 /*return*/, answer.example]; 128 | } 129 | }); 130 | }); }; 131 | exports.shouldSetupCI = shouldSetupCI; 132 | -------------------------------------------------------------------------------- /lib/handler.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import { execSync } from "child_process"; 3 | import inquirer from "inquirer"; 4 | import chalk from "chalk"; 5 | import fs from "fs"; 6 | import fetch from "node-fetch"; 7 | import zipper from "node-stream-zip"; 8 | 9 | export async function handler(template: string, name: string, setupCI: boolean) { 10 | console.clear(); 11 | const examples = require(path.resolve(__dirname, "api.json")); 12 | console.log(chalk.gray("Template: "), chalk.green(template)); 13 | console.log(chalk.gray("App name: "), chalk.green(name)); 14 | console.log(chalk.gray("Setup CI: "), chalk.green(setupCI ? 'Yes' : 'No')); 15 | inquirer 16 | .prompt([ 17 | { 18 | type: "confirm", 19 | name: "confirm", 20 | message: "Proceed?", 21 | default: true, 22 | }, 23 | ]) 24 | .then(async (answers) => { 25 | if (answers.confirm) { 26 | console.clear(); 27 | var start = new Date(); 28 | const pathname = `${path.resolve("./")}/${name}`; 29 | if (fs.existsSync(pathname)) { 30 | console.log(chalk.gray(`Directory already exists: ${pathname}`)); 31 | await inquirer 32 | .prompt([ 33 | { 34 | type: "confirm", 35 | name: "confirm", 36 | message: "Overwrite?", 37 | default: false, 38 | }, 39 | ]) 40 | .then(async (answers) => { 41 | if (!answers.confirm) { 42 | process.exit(1); 43 | } 44 | }); 45 | } 46 | const ex = examples[template]; 47 | console.log(chalk.gray("Setting up...")); 48 | console.log(chalk.gray("Cloning repo...")); 49 | await download(ex.repo, pathname, name); 50 | console.clear(); 51 | console.log(chalk.gray("Setting up...")); 52 | console.log(chalk.gray("Installing Dependencies...")); 53 | execSync(`cd ${pathname} && ${ex.install} --force && git init`, { 54 | stdio: [1], 55 | }); 56 | console.clear(); 57 | console.log( 58 | `Done in ${(new Date().getTime() - start.getTime()) / 1000}s ✨ ` 59 | ); 60 | const startCommand = ex.run; 61 | 62 | if (ex.guide !== undefined && ex.guide !== "") { 63 | console.log(`Find accompanying tutorial at ${chalk.green(ex.guide)}`); 64 | } 65 | if (ex.docs !== undefined && ex.docs !== "") { 66 | console.log(`Check out docs at ${chalk.green(ex.docs)}`); 67 | } 68 | if (startCommand !== undefined && startCommand !== "") { 69 | console.log( 70 | "run `" + 71 | chalk.green( 72 | `cd ${name}${startCommand ? " && " + startCommand : ""}` 73 | ) + 74 | "` to get started" 75 | ); 76 | } 77 | if (setupCI) { 78 | execSync(`mkdir -p ${pathname}/.github/workflows`, { stdio: [1] }); 79 | console.log(chalk.gray("Setting up...")); 80 | console.log(chalk.grey('Setting up CI for the project...')) 81 | 82 | const file = await fetch('https://gist.githubusercontent.com/anoushk1234/0f86460f08821bdbbdb03a3f56681928/raw/995c7d1a221546cadef7fa47131eef1a57001706/tests.yml'); 83 | const fileStream = fs.createWriteStream(`${pathname}/.github/workflows/ci.yml`); 84 | 85 | await new Promise((resolve, reject) => { 86 | file.body.pipe(fileStream); 87 | file.body.on("error", reject); 88 | fileStream.on("finish", resolve); 89 | }); 90 | } 91 | } else { 92 | console.log(chalk.red("Operation cancelled by user")); 93 | } 94 | }) 95 | .catch((err) => { 96 | console.clear(); 97 | if (err.command) { 98 | console.log(`${chalk.cyan(err.command)} has failed.`); 99 | } else { 100 | console.log(chalk.red("Unexpected error. Please report it as a bug:")); 101 | console.log(err.message); 102 | } 103 | }); 104 | } 105 | async function download(repo: string, path: string, name: string) { 106 | let branch: string = "master"; 107 | let res = (await fetch( 108 | `https://codeload.github.com/create-anchor-app/${repo}/zip/refs/heads/master` 109 | )) as any; 110 | if (res.status !== 200) { 111 | res = (await fetch( 112 | `https://codeload.github.com/create-anchor-app/${repo}/zip/refs/heads/main` 113 | )) as any; 114 | branch = "main"; 115 | } 116 | console.log(chalk.gray(res.statusText)); 117 | const fileStream = fs.createWriteStream(`${__dirname}/${name}.zip`); 118 | await new Promise((resolve, reject) => { 119 | res.body.pipe(fileStream); 120 | res.body.on("error", reject); 121 | fileStream.on("finish", resolve); 122 | }); 123 | 124 | fs.mkdirSync(path); 125 | const zip = new zipper.async({ file: `${__dirname}/${name}.zip` }); 126 | await zip.extract(`${repo}-${branch}`, path); 127 | console.log(chalk.gray("Done")); 128 | await zip.close(); 129 | fs.unlinkSync(`${__dirname}/${name}.zip`); 130 | } 131 | -------------------------------------------------------------------------------- /lib/index.ts: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | "use strict"; 4 | import inquirer from "inquirer"; 5 | import { promises } from "fs"; 6 | import fetch from "node-fetch"; 7 | import { handler } from "./handler"; 8 | import path from "path"; 9 | import chalk from "chalk"; 10 | 11 | import { chooseName, flags, shouldSetupCI, whatAreYouBuilding } from "./utils"; 12 | 13 | const args = process.argv.slice(2); 14 | const supportedCommands: string[] = ["-v", "--version", "-h", "--help"]; 15 | 16 | console.clear(); 17 | 18 | 19 | (async () => { 20 | try { 21 | const filePath = path.resolve(__dirname, "api.json"); 22 | const res = await fetch("https://create-anchor-app.vercel.app/api.json") 23 | 24 | await promises.writeFile(filePath, await res.text()); 25 | const examples = require(filePath); 26 | 27 | if (args.length) { 28 | if (supportedCommands.includes(args[0])) { 29 | flags(args[0]); 30 | } 31 | 32 | if (!Object.keys(examples).includes(args[0])) { 33 | flags(args[0]); 34 | } 35 | 36 | if (args.length > 2 && args.filter((x) => !supportedCommands.includes(x)).length > 0) { 37 | console.log(chalk.red("Unexpected flag(s) :", args.join(" "))); 38 | process.exit(1); 39 | } 40 | } 41 | 42 | const exampleName = args[0] || await whatAreYouBuilding(examples); 43 | const answer = args[1] || await chooseName(); 44 | const setupCI = args[2] || await shouldSetupCI(); 45 | 46 | await handler(exampleName, answer, setupCI); 47 | 48 | 49 | 50 | } catch (err: any) { 51 | console.log(chalk.red(`Error fetching latest examples: ${err.message}`)); 52 | process.exit(1); 53 | }; 54 | })(); 55 | 56 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import inquirer from "inquirer"; 3 | import generate from "project-name-generator"; 4 | import path from "path"; 5 | 6 | export function flags(flag: string) { 7 | switch (flag) { 8 | case "-h" || "--help": 9 | console.log( 10 | `Please visit ${chalk.cyan( 11 | "https://github.com/create-anchor-app/cli#readme" 12 | )} to know more about the usage of this CLI.` 13 | ); 14 | break; 15 | 16 | case "-v" || "--version": 17 | console.log( 18 | `${chalk.cyan("create-anchor-app")} ${chalk.green( 19 | require(path.resolve(__dirname, "../package.json")).version 20 | )}` 21 | ); 22 | break; 23 | default: 24 | console.log(chalk.red("Unexpected flag or project type:", flag)); 25 | } 26 | process.exit(1); 27 | } 28 | 29 | export async function chooseName() { 30 | const answer = await inquirer 31 | .prompt([ 32 | { 33 | type: "input", 34 | name: "name", 35 | message: "Name of the app?", 36 | default: generate().dashed, 37 | }, 38 | ]).catch((err) => { 39 | console.log(chalk.red("Unexpected error:", err)); 40 | process.exit(1); 41 | }); 42 | 43 | return answer.name; 44 | 45 | 46 | } 47 | 48 | 49 | 50 | export const whatAreYouBuilding = async (examples: Object) => { 51 | 52 | const answer = await inquirer 53 | .prompt([ 54 | { 55 | type: "list", 56 | name: "example", 57 | message: "What are you building today?", 58 | choices: Object.keys(examples), 59 | }, 60 | ]).catch((err) => { 61 | console.log(chalk.red("Unexpected error:", err)); 62 | process.exit(1); 63 | }); 64 | 65 | return answer.example 66 | 67 | }; 68 | 69 | export const shouldSetupCI = async () => { 70 | 71 | const answer = await inquirer 72 | .prompt([ 73 | { 74 | type: "confirm", 75 | name: "example", 76 | message: "Do you want to setup CI?", 77 | default: true, 78 | }, 79 | ]).catch((err) => { 80 | console.log(chalk.red("Unexpected error:", err)); 81 | process.exit(1); 82 | }); 83 | 84 | return answer.example 85 | 86 | }; -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@create-anchor-app/cli", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@create-anchor-app/cli", 9 | "version": "0.1.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@types/project-name-generator": "^2.1.1", 13 | "chalk": "4.1.2", 14 | "inquirer": "^8.2.0", 15 | "node-fetch": "^2.6.7", 16 | "node-stream-zip": "^1.15.0", 17 | "project-name-generator": "^2.1.9" 18 | }, 19 | "bin": { 20 | "create-anchor-app": "bin/index.js" 21 | }, 22 | "devDependencies": { 23 | "@types/inquirer": "^8.2.0", 24 | "@types/node-fetch": "2", 25 | "@types/unzipper": "^0.10.5", 26 | "typescript": "^4.4.3" 27 | } 28 | }, 29 | "node_modules/@types/inquirer": { 30 | "version": "8.2.0", 31 | "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.0.tgz", 32 | "integrity": "sha512-BNoMetRf3gmkpAlV5we+kxyZTle7YibdOntIZbU5pyIfMdcwy784KfeZDAcuyMznkh5OLa17RVXZOGA5LTlkgQ==", 33 | "dev": true, 34 | "dependencies": { 35 | "@types/through": "*", 36 | "rxjs": "^7.2.0" 37 | } 38 | }, 39 | "node_modules/@types/node": { 40 | "version": "17.0.21", 41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", 42 | "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", 43 | "dev": true 44 | }, 45 | "node_modules/@types/node-fetch": { 46 | "version": "2.6.1", 47 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", 48 | "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", 49 | "dev": true, 50 | "dependencies": { 51 | "@types/node": "*", 52 | "form-data": "^3.0.0" 53 | } 54 | }, 55 | "node_modules/@types/project-name-generator": { 56 | "version": "2.1.1", 57 | "resolved": "https://registry.npmjs.org/@types/project-name-generator/-/project-name-generator-2.1.1.tgz", 58 | "integrity": "sha512-VLd5FEVTJs8hNa/WF4pZRcFvv0OAcIGeTyki4RDcaID0TUhTc5/Xe/btYM2XIHwVCb67ila8wUJYKJNa5dVABw==" 59 | }, 60 | "node_modules/@types/through": { 61 | "version": "0.0.30", 62 | "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", 63 | "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", 64 | "dev": true, 65 | "dependencies": { 66 | "@types/node": "*" 67 | } 68 | }, 69 | "node_modules/@types/unzipper": { 70 | "version": "0.10.5", 71 | "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.5.tgz", 72 | "integrity": "sha512-NrLJb29AdnBARpg9S/4ktfPEisbJ0AvaaAr3j7Q1tg8AgcEUsq2HqbNzvgLRoWyRtjzeLEv7vuL39u1mrNIyNA==", 73 | "dev": true, 74 | "dependencies": { 75 | "@types/node": "*" 76 | } 77 | }, 78 | "node_modules/ansi-escapes": { 79 | "version": "4.3.2", 80 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 81 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 82 | "dependencies": { 83 | "type-fest": "^0.21.3" 84 | }, 85 | "engines": { 86 | "node": ">=8" 87 | }, 88 | "funding": { 89 | "url": "https://github.com/sponsors/sindresorhus" 90 | } 91 | }, 92 | "node_modules/ansi-regex": { 93 | "version": "5.0.1", 94 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 95 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 96 | "engines": { 97 | "node": ">=8" 98 | } 99 | }, 100 | "node_modules/ansi-styles": { 101 | "version": "4.3.0", 102 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 103 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 104 | "dependencies": { 105 | "color-convert": "^2.0.1" 106 | }, 107 | "engines": { 108 | "node": ">=8" 109 | }, 110 | "funding": { 111 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 112 | } 113 | }, 114 | "node_modules/asynckit": { 115 | "version": "0.4.0", 116 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 117 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 118 | "dev": true 119 | }, 120 | "node_modules/base64-js": { 121 | "version": "1.5.1", 122 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 123 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 124 | "funding": [ 125 | { 126 | "type": "github", 127 | "url": "https://github.com/sponsors/feross" 128 | }, 129 | { 130 | "type": "patreon", 131 | "url": "https://www.patreon.com/feross" 132 | }, 133 | { 134 | "type": "consulting", 135 | "url": "https://feross.org/support" 136 | } 137 | ] 138 | }, 139 | "node_modules/bl": { 140 | "version": "4.1.0", 141 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 142 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 143 | "dependencies": { 144 | "buffer": "^5.5.0", 145 | "inherits": "^2.0.4", 146 | "readable-stream": "^3.4.0" 147 | } 148 | }, 149 | "node_modules/buffer": { 150 | "version": "5.7.1", 151 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 152 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 153 | "funding": [ 154 | { 155 | "type": "github", 156 | "url": "https://github.com/sponsors/feross" 157 | }, 158 | { 159 | "type": "patreon", 160 | "url": "https://www.patreon.com/feross" 161 | }, 162 | { 163 | "type": "consulting", 164 | "url": "https://feross.org/support" 165 | } 166 | ], 167 | "dependencies": { 168 | "base64-js": "^1.3.1", 169 | "ieee754": "^1.1.13" 170 | } 171 | }, 172 | "node_modules/chalk": { 173 | "version": "4.1.2", 174 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 175 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 176 | "dependencies": { 177 | "ansi-styles": "^4.1.0", 178 | "supports-color": "^7.1.0" 179 | }, 180 | "engines": { 181 | "node": ">=10" 182 | }, 183 | "funding": { 184 | "url": "https://github.com/chalk/chalk?sponsor=1" 185 | } 186 | }, 187 | "node_modules/chardet": { 188 | "version": "0.7.0", 189 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 190 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 191 | }, 192 | "node_modules/cli-cursor": { 193 | "version": "3.1.0", 194 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 195 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 196 | "dependencies": { 197 | "restore-cursor": "^3.1.0" 198 | }, 199 | "engines": { 200 | "node": ">=8" 201 | } 202 | }, 203 | "node_modules/cli-spinners": { 204 | "version": "2.6.1", 205 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", 206 | "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", 207 | "engines": { 208 | "node": ">=6" 209 | }, 210 | "funding": { 211 | "url": "https://github.com/sponsors/sindresorhus" 212 | } 213 | }, 214 | "node_modules/cli-width": { 215 | "version": "3.0.0", 216 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 217 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", 218 | "engines": { 219 | "node": ">= 10" 220 | } 221 | }, 222 | "node_modules/clone": { 223 | "version": "1.0.4", 224 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 225 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 226 | "engines": { 227 | "node": ">=0.8" 228 | } 229 | }, 230 | "node_modules/color-convert": { 231 | "version": "2.0.1", 232 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 233 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 234 | "dependencies": { 235 | "color-name": "~1.1.4" 236 | }, 237 | "engines": { 238 | "node": ">=7.0.0" 239 | } 240 | }, 241 | "node_modules/color-name": { 242 | "version": "1.1.4", 243 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 244 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 245 | }, 246 | "node_modules/combined-stream": { 247 | "version": "1.0.8", 248 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 249 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 250 | "dev": true, 251 | "dependencies": { 252 | "delayed-stream": "~1.0.0" 253 | }, 254 | "engines": { 255 | "node": ">= 0.8" 256 | } 257 | }, 258 | "node_modules/commander": { 259 | "version": "6.2.1", 260 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 261 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", 262 | "engines": { 263 | "node": ">= 6" 264 | } 265 | }, 266 | "node_modules/defaults": { 267 | "version": "1.0.3", 268 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 269 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 270 | "dependencies": { 271 | "clone": "^1.0.2" 272 | } 273 | }, 274 | "node_modules/delayed-stream": { 275 | "version": "1.0.0", 276 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 277 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 278 | "dev": true, 279 | "engines": { 280 | "node": ">=0.4.0" 281 | } 282 | }, 283 | "node_modules/emoji-regex": { 284 | "version": "8.0.0", 285 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 286 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 287 | }, 288 | "node_modules/escape-string-regexp": { 289 | "version": "1.0.5", 290 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 291 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 292 | "engines": { 293 | "node": ">=0.8.0" 294 | } 295 | }, 296 | "node_modules/external-editor": { 297 | "version": "3.1.0", 298 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 299 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 300 | "dependencies": { 301 | "chardet": "^0.7.0", 302 | "iconv-lite": "^0.4.24", 303 | "tmp": "^0.0.33" 304 | }, 305 | "engines": { 306 | "node": ">=4" 307 | } 308 | }, 309 | "node_modules/figures": { 310 | "version": "3.2.0", 311 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 312 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 313 | "dependencies": { 314 | "escape-string-regexp": "^1.0.5" 315 | }, 316 | "engines": { 317 | "node": ">=8" 318 | }, 319 | "funding": { 320 | "url": "https://github.com/sponsors/sindresorhus" 321 | } 322 | }, 323 | "node_modules/form-data": { 324 | "version": "3.0.1", 325 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 326 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 327 | "dev": true, 328 | "dependencies": { 329 | "asynckit": "^0.4.0", 330 | "combined-stream": "^1.0.8", 331 | "mime-types": "^2.1.12" 332 | }, 333 | "engines": { 334 | "node": ">= 6" 335 | } 336 | }, 337 | "node_modules/has-flag": { 338 | "version": "4.0.0", 339 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 340 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 341 | "engines": { 342 | "node": ">=8" 343 | } 344 | }, 345 | "node_modules/iconv-lite": { 346 | "version": "0.4.24", 347 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 348 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 349 | "dependencies": { 350 | "safer-buffer": ">= 2.1.2 < 3" 351 | }, 352 | "engines": { 353 | "node": ">=0.10.0" 354 | } 355 | }, 356 | "node_modules/ieee754": { 357 | "version": "1.2.1", 358 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 359 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 360 | "funding": [ 361 | { 362 | "type": "github", 363 | "url": "https://github.com/sponsors/feross" 364 | }, 365 | { 366 | "type": "patreon", 367 | "url": "https://www.patreon.com/feross" 368 | }, 369 | { 370 | "type": "consulting", 371 | "url": "https://feross.org/support" 372 | } 373 | ] 374 | }, 375 | "node_modules/inherits": { 376 | "version": "2.0.4", 377 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 378 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 379 | }, 380 | "node_modules/inquirer": { 381 | "version": "8.2.0", 382 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", 383 | "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", 384 | "dependencies": { 385 | "ansi-escapes": "^4.2.1", 386 | "chalk": "^4.1.1", 387 | "cli-cursor": "^3.1.0", 388 | "cli-width": "^3.0.0", 389 | "external-editor": "^3.0.3", 390 | "figures": "^3.0.0", 391 | "lodash": "^4.17.21", 392 | "mute-stream": "0.0.8", 393 | "ora": "^5.4.1", 394 | "run-async": "^2.4.0", 395 | "rxjs": "^7.2.0", 396 | "string-width": "^4.1.0", 397 | "strip-ansi": "^6.0.0", 398 | "through": "^2.3.6" 399 | }, 400 | "engines": { 401 | "node": ">=8.0.0" 402 | } 403 | }, 404 | "node_modules/is-fullwidth-code-point": { 405 | "version": "3.0.0", 406 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 407 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 408 | "engines": { 409 | "node": ">=8" 410 | } 411 | }, 412 | "node_modules/is-interactive": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 415 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", 416 | "engines": { 417 | "node": ">=8" 418 | } 419 | }, 420 | "node_modules/is-unicode-supported": { 421 | "version": "0.1.0", 422 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 423 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 424 | "engines": { 425 | "node": ">=10" 426 | }, 427 | "funding": { 428 | "url": "https://github.com/sponsors/sindresorhus" 429 | } 430 | }, 431 | "node_modules/lodash": { 432 | "version": "4.17.21", 433 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 434 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 435 | }, 436 | "node_modules/log-symbols": { 437 | "version": "4.1.0", 438 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 439 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 440 | "dependencies": { 441 | "chalk": "^4.1.0", 442 | "is-unicode-supported": "^0.1.0" 443 | }, 444 | "engines": { 445 | "node": ">=10" 446 | }, 447 | "funding": { 448 | "url": "https://github.com/sponsors/sindresorhus" 449 | } 450 | }, 451 | "node_modules/mime-db": { 452 | "version": "1.51.0", 453 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 454 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 455 | "dev": true, 456 | "engines": { 457 | "node": ">= 0.6" 458 | } 459 | }, 460 | "node_modules/mime-types": { 461 | "version": "2.1.34", 462 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 463 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 464 | "dev": true, 465 | "dependencies": { 466 | "mime-db": "1.51.0" 467 | }, 468 | "engines": { 469 | "node": ">= 0.6" 470 | } 471 | }, 472 | "node_modules/mimic-fn": { 473 | "version": "2.1.0", 474 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 475 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 476 | "engines": { 477 | "node": ">=6" 478 | } 479 | }, 480 | "node_modules/mute-stream": { 481 | "version": "0.0.8", 482 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 483 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 484 | }, 485 | "node_modules/node-fetch": { 486 | "version": "2.6.7", 487 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 488 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 489 | "dependencies": { 490 | "whatwg-url": "^5.0.0" 491 | }, 492 | "engines": { 493 | "node": "4.x || >=6.0.0" 494 | }, 495 | "peerDependencies": { 496 | "encoding": "^0.1.0" 497 | }, 498 | "peerDependenciesMeta": { 499 | "encoding": { 500 | "optional": true 501 | } 502 | } 503 | }, 504 | "node_modules/node-stream-zip": { 505 | "version": "1.15.0", 506 | "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", 507 | "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", 508 | "engines": { 509 | "node": ">=0.12.0" 510 | }, 511 | "funding": { 512 | "type": "github", 513 | "url": "https://github.com/sponsors/antelle" 514 | } 515 | }, 516 | "node_modules/onetime": { 517 | "version": "5.1.2", 518 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 519 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 520 | "dependencies": { 521 | "mimic-fn": "^2.1.0" 522 | }, 523 | "engines": { 524 | "node": ">=6" 525 | }, 526 | "funding": { 527 | "url": "https://github.com/sponsors/sindresorhus" 528 | } 529 | }, 530 | "node_modules/ora": { 531 | "version": "5.4.1", 532 | "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 533 | "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 534 | "dependencies": { 535 | "bl": "^4.1.0", 536 | "chalk": "^4.1.0", 537 | "cli-cursor": "^3.1.0", 538 | "cli-spinners": "^2.5.0", 539 | "is-interactive": "^1.0.0", 540 | "is-unicode-supported": "^0.1.0", 541 | "log-symbols": "^4.1.0", 542 | "strip-ansi": "^6.0.0", 543 | "wcwidth": "^1.0.1" 544 | }, 545 | "engines": { 546 | "node": ">=10" 547 | }, 548 | "funding": { 549 | "url": "https://github.com/sponsors/sindresorhus" 550 | } 551 | }, 552 | "node_modules/os-tmpdir": { 553 | "version": "1.0.2", 554 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 555 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 556 | "engines": { 557 | "node": ">=0.10.0" 558 | } 559 | }, 560 | "node_modules/project-name-generator": { 561 | "version": "2.1.9", 562 | "resolved": "https://registry.npmjs.org/project-name-generator/-/project-name-generator-2.1.9.tgz", 563 | "integrity": "sha512-QmLHqz2C4VHmAyDEAFlVfnuWAHr4vwZhK2bbm4IrwuHNzNKOdG9b4U+NmQbsm1uOoV4kGWv7+FVLsu7Bb/ieYQ==", 564 | "dependencies": { 565 | "commander": "^6.1.0", 566 | "lodash": "^4.17.20" 567 | }, 568 | "bin": { 569 | "project-name-generator": "src/generator-bin.js" 570 | } 571 | }, 572 | "node_modules/readable-stream": { 573 | "version": "3.6.0", 574 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 575 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 576 | "dependencies": { 577 | "inherits": "^2.0.3", 578 | "string_decoder": "^1.1.1", 579 | "util-deprecate": "^1.0.1" 580 | }, 581 | "engines": { 582 | "node": ">= 6" 583 | } 584 | }, 585 | "node_modules/restore-cursor": { 586 | "version": "3.1.0", 587 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 588 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 589 | "dependencies": { 590 | "onetime": "^5.1.0", 591 | "signal-exit": "^3.0.2" 592 | }, 593 | "engines": { 594 | "node": ">=8" 595 | } 596 | }, 597 | "node_modules/run-async": { 598 | "version": "2.4.1", 599 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 600 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 601 | "engines": { 602 | "node": ">=0.12.0" 603 | } 604 | }, 605 | "node_modules/rxjs": { 606 | "version": "7.5.4", 607 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.4.tgz", 608 | "integrity": "sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==", 609 | "dependencies": { 610 | "tslib": "^2.1.0" 611 | } 612 | }, 613 | "node_modules/safe-buffer": { 614 | "version": "5.2.1", 615 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 616 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 617 | "funding": [ 618 | { 619 | "type": "github", 620 | "url": "https://github.com/sponsors/feross" 621 | }, 622 | { 623 | "type": "patreon", 624 | "url": "https://www.patreon.com/feross" 625 | }, 626 | { 627 | "type": "consulting", 628 | "url": "https://feross.org/support" 629 | } 630 | ] 631 | }, 632 | "node_modules/safer-buffer": { 633 | "version": "2.1.2", 634 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 635 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 636 | }, 637 | "node_modules/signal-exit": { 638 | "version": "3.0.7", 639 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 640 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 641 | }, 642 | "node_modules/string_decoder": { 643 | "version": "1.3.0", 644 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 645 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 646 | "dependencies": { 647 | "safe-buffer": "~5.2.0" 648 | } 649 | }, 650 | "node_modules/string-width": { 651 | "version": "4.2.3", 652 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 653 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 654 | "dependencies": { 655 | "emoji-regex": "^8.0.0", 656 | "is-fullwidth-code-point": "^3.0.0", 657 | "strip-ansi": "^6.0.1" 658 | }, 659 | "engines": { 660 | "node": ">=8" 661 | } 662 | }, 663 | "node_modules/strip-ansi": { 664 | "version": "6.0.1", 665 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 666 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 667 | "dependencies": { 668 | "ansi-regex": "^5.0.1" 669 | }, 670 | "engines": { 671 | "node": ">=8" 672 | } 673 | }, 674 | "node_modules/supports-color": { 675 | "version": "7.2.0", 676 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 677 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 678 | "dependencies": { 679 | "has-flag": "^4.0.0" 680 | }, 681 | "engines": { 682 | "node": ">=8" 683 | } 684 | }, 685 | "node_modules/through": { 686 | "version": "2.3.8", 687 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 688 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 689 | }, 690 | "node_modules/tmp": { 691 | "version": "0.0.33", 692 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 693 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 694 | "dependencies": { 695 | "os-tmpdir": "~1.0.2" 696 | }, 697 | "engines": { 698 | "node": ">=0.6.0" 699 | } 700 | }, 701 | "node_modules/tr46": { 702 | "version": "0.0.3", 703 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 704 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 705 | }, 706 | "node_modules/tslib": { 707 | "version": "2.3.1", 708 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 709 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 710 | }, 711 | "node_modules/type-fest": { 712 | "version": "0.21.3", 713 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 714 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 715 | "engines": { 716 | "node": ">=10" 717 | }, 718 | "funding": { 719 | "url": "https://github.com/sponsors/sindresorhus" 720 | } 721 | }, 722 | "node_modules/typescript": { 723 | "version": "4.6.2", 724 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", 725 | "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", 726 | "dev": true, 727 | "bin": { 728 | "tsc": "bin/tsc", 729 | "tsserver": "bin/tsserver" 730 | }, 731 | "engines": { 732 | "node": ">=4.2.0" 733 | } 734 | }, 735 | "node_modules/util-deprecate": { 736 | "version": "1.0.2", 737 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 738 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 739 | }, 740 | "node_modules/wcwidth": { 741 | "version": "1.0.1", 742 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 743 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 744 | "dependencies": { 745 | "defaults": "^1.0.3" 746 | } 747 | }, 748 | "node_modules/webidl-conversions": { 749 | "version": "3.0.1", 750 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 751 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 752 | }, 753 | "node_modules/whatwg-url": { 754 | "version": "5.0.0", 755 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 756 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 757 | "dependencies": { 758 | "tr46": "~0.0.3", 759 | "webidl-conversions": "^3.0.0" 760 | } 761 | } 762 | }, 763 | "dependencies": { 764 | "@types/inquirer": { 765 | "version": "8.2.0", 766 | "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.0.tgz", 767 | "integrity": "sha512-BNoMetRf3gmkpAlV5we+kxyZTle7YibdOntIZbU5pyIfMdcwy784KfeZDAcuyMznkh5OLa17RVXZOGA5LTlkgQ==", 768 | "dev": true, 769 | "requires": { 770 | "@types/through": "*", 771 | "rxjs": "^7.2.0" 772 | } 773 | }, 774 | "@types/node": { 775 | "version": "17.0.21", 776 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", 777 | "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", 778 | "dev": true 779 | }, 780 | "@types/node-fetch": { 781 | "version": "2.6.1", 782 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", 783 | "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", 784 | "dev": true, 785 | "requires": { 786 | "@types/node": "*", 787 | "form-data": "^3.0.0" 788 | } 789 | }, 790 | "@types/project-name-generator": { 791 | "version": "2.1.1", 792 | "resolved": "https://registry.npmjs.org/@types/project-name-generator/-/project-name-generator-2.1.1.tgz", 793 | "integrity": "sha512-VLd5FEVTJs8hNa/WF4pZRcFvv0OAcIGeTyki4RDcaID0TUhTc5/Xe/btYM2XIHwVCb67ila8wUJYKJNa5dVABw==" 794 | }, 795 | "@types/through": { 796 | "version": "0.0.30", 797 | "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", 798 | "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", 799 | "dev": true, 800 | "requires": { 801 | "@types/node": "*" 802 | } 803 | }, 804 | "@types/unzipper": { 805 | "version": "0.10.5", 806 | "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.5.tgz", 807 | "integrity": "sha512-NrLJb29AdnBARpg9S/4ktfPEisbJ0AvaaAr3j7Q1tg8AgcEUsq2HqbNzvgLRoWyRtjzeLEv7vuL39u1mrNIyNA==", 808 | "dev": true, 809 | "requires": { 810 | "@types/node": "*" 811 | } 812 | }, 813 | "ansi-escapes": { 814 | "version": "4.3.2", 815 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 816 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 817 | "requires": { 818 | "type-fest": "^0.21.3" 819 | } 820 | }, 821 | "ansi-regex": { 822 | "version": "5.0.1", 823 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 824 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 825 | }, 826 | "ansi-styles": { 827 | "version": "4.3.0", 828 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 829 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 830 | "requires": { 831 | "color-convert": "^2.0.1" 832 | } 833 | }, 834 | "asynckit": { 835 | "version": "0.4.0", 836 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 837 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 838 | "dev": true 839 | }, 840 | "base64-js": { 841 | "version": "1.5.1", 842 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 843 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 844 | }, 845 | "bl": { 846 | "version": "4.1.0", 847 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 848 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 849 | "requires": { 850 | "buffer": "^5.5.0", 851 | "inherits": "^2.0.4", 852 | "readable-stream": "^3.4.0" 853 | } 854 | }, 855 | "buffer": { 856 | "version": "5.7.1", 857 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 858 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 859 | "requires": { 860 | "base64-js": "^1.3.1", 861 | "ieee754": "^1.1.13" 862 | } 863 | }, 864 | "chalk": { 865 | "version": "4.1.2", 866 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 867 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 868 | "requires": { 869 | "ansi-styles": "^4.1.0", 870 | "supports-color": "^7.1.0" 871 | } 872 | }, 873 | "chardet": { 874 | "version": "0.7.0", 875 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 876 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 877 | }, 878 | "cli-cursor": { 879 | "version": "3.1.0", 880 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 881 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 882 | "requires": { 883 | "restore-cursor": "^3.1.0" 884 | } 885 | }, 886 | "cli-spinners": { 887 | "version": "2.6.1", 888 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", 889 | "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" 890 | }, 891 | "cli-width": { 892 | "version": "3.0.0", 893 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", 894 | "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" 895 | }, 896 | "clone": { 897 | "version": "1.0.4", 898 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 899 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" 900 | }, 901 | "color-convert": { 902 | "version": "2.0.1", 903 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 904 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 905 | "requires": { 906 | "color-name": "~1.1.4" 907 | } 908 | }, 909 | "color-name": { 910 | "version": "1.1.4", 911 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 912 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 913 | }, 914 | "combined-stream": { 915 | "version": "1.0.8", 916 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 917 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 918 | "dev": true, 919 | "requires": { 920 | "delayed-stream": "~1.0.0" 921 | } 922 | }, 923 | "commander": { 924 | "version": "6.2.1", 925 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 926 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" 927 | }, 928 | "defaults": { 929 | "version": "1.0.3", 930 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 931 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 932 | "requires": { 933 | "clone": "^1.0.2" 934 | } 935 | }, 936 | "delayed-stream": { 937 | "version": "1.0.0", 938 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 939 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 940 | "dev": true 941 | }, 942 | "emoji-regex": { 943 | "version": "8.0.0", 944 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 945 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 946 | }, 947 | "escape-string-regexp": { 948 | "version": "1.0.5", 949 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 950 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 951 | }, 952 | "external-editor": { 953 | "version": "3.1.0", 954 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 955 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 956 | "requires": { 957 | "chardet": "^0.7.0", 958 | "iconv-lite": "^0.4.24", 959 | "tmp": "^0.0.33" 960 | } 961 | }, 962 | "figures": { 963 | "version": "3.2.0", 964 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 965 | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 966 | "requires": { 967 | "escape-string-regexp": "^1.0.5" 968 | } 969 | }, 970 | "form-data": { 971 | "version": "3.0.1", 972 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 973 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 974 | "dev": true, 975 | "requires": { 976 | "asynckit": "^0.4.0", 977 | "combined-stream": "^1.0.8", 978 | "mime-types": "^2.1.12" 979 | } 980 | }, 981 | "has-flag": { 982 | "version": "4.0.0", 983 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 984 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 985 | }, 986 | "iconv-lite": { 987 | "version": "0.4.24", 988 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 989 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 990 | "requires": { 991 | "safer-buffer": ">= 2.1.2 < 3" 992 | } 993 | }, 994 | "ieee754": { 995 | "version": "1.2.1", 996 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 997 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 998 | }, 999 | "inherits": { 1000 | "version": "2.0.4", 1001 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1002 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1003 | }, 1004 | "inquirer": { 1005 | "version": "8.2.0", 1006 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", 1007 | "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", 1008 | "requires": { 1009 | "ansi-escapes": "^4.2.1", 1010 | "chalk": "^4.1.1", 1011 | "cli-cursor": "^3.1.0", 1012 | "cli-width": "^3.0.0", 1013 | "external-editor": "^3.0.3", 1014 | "figures": "^3.0.0", 1015 | "lodash": "^4.17.21", 1016 | "mute-stream": "0.0.8", 1017 | "ora": "^5.4.1", 1018 | "run-async": "^2.4.0", 1019 | "rxjs": "^7.2.0", 1020 | "string-width": "^4.1.0", 1021 | "strip-ansi": "^6.0.0", 1022 | "through": "^2.3.6" 1023 | } 1024 | }, 1025 | "is-fullwidth-code-point": { 1026 | "version": "3.0.0", 1027 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1028 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1029 | }, 1030 | "is-interactive": { 1031 | "version": "1.0.0", 1032 | "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", 1033 | "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" 1034 | }, 1035 | "is-unicode-supported": { 1036 | "version": "0.1.0", 1037 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1038 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" 1039 | }, 1040 | "lodash": { 1041 | "version": "4.17.21", 1042 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1043 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1044 | }, 1045 | "log-symbols": { 1046 | "version": "4.1.0", 1047 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1048 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1049 | "requires": { 1050 | "chalk": "^4.1.0", 1051 | "is-unicode-supported": "^0.1.0" 1052 | } 1053 | }, 1054 | "mime-db": { 1055 | "version": "1.51.0", 1056 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1057 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 1058 | "dev": true 1059 | }, 1060 | "mime-types": { 1061 | "version": "2.1.34", 1062 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1063 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1064 | "dev": true, 1065 | "requires": { 1066 | "mime-db": "1.51.0" 1067 | } 1068 | }, 1069 | "mimic-fn": { 1070 | "version": "2.1.0", 1071 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1072 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 1073 | }, 1074 | "mute-stream": { 1075 | "version": "0.0.8", 1076 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1077 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 1078 | }, 1079 | "node-fetch": { 1080 | "version": "2.6.7", 1081 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1082 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1083 | "requires": { 1084 | "whatwg-url": "^5.0.0" 1085 | } 1086 | }, 1087 | "node-stream-zip": { 1088 | "version": "1.15.0", 1089 | "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", 1090 | "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==" 1091 | }, 1092 | "onetime": { 1093 | "version": "5.1.2", 1094 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1095 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1096 | "requires": { 1097 | "mimic-fn": "^2.1.0" 1098 | } 1099 | }, 1100 | "ora": { 1101 | "version": "5.4.1", 1102 | "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", 1103 | "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", 1104 | "requires": { 1105 | "bl": "^4.1.0", 1106 | "chalk": "^4.1.0", 1107 | "cli-cursor": "^3.1.0", 1108 | "cli-spinners": "^2.5.0", 1109 | "is-interactive": "^1.0.0", 1110 | "is-unicode-supported": "^0.1.0", 1111 | "log-symbols": "^4.1.0", 1112 | "strip-ansi": "^6.0.0", 1113 | "wcwidth": "^1.0.1" 1114 | } 1115 | }, 1116 | "os-tmpdir": { 1117 | "version": "1.0.2", 1118 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1119 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1120 | }, 1121 | "project-name-generator": { 1122 | "version": "2.1.9", 1123 | "resolved": "https://registry.npmjs.org/project-name-generator/-/project-name-generator-2.1.9.tgz", 1124 | "integrity": "sha512-QmLHqz2C4VHmAyDEAFlVfnuWAHr4vwZhK2bbm4IrwuHNzNKOdG9b4U+NmQbsm1uOoV4kGWv7+FVLsu7Bb/ieYQ==", 1125 | "requires": { 1126 | "commander": "^6.1.0", 1127 | "lodash": "^4.17.20" 1128 | } 1129 | }, 1130 | "readable-stream": { 1131 | "version": "3.6.0", 1132 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1133 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1134 | "requires": { 1135 | "inherits": "^2.0.3", 1136 | "string_decoder": "^1.1.1", 1137 | "util-deprecate": "^1.0.1" 1138 | } 1139 | }, 1140 | "restore-cursor": { 1141 | "version": "3.1.0", 1142 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1143 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1144 | "requires": { 1145 | "onetime": "^5.1.0", 1146 | "signal-exit": "^3.0.2" 1147 | } 1148 | }, 1149 | "run-async": { 1150 | "version": "2.4.1", 1151 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1152 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" 1153 | }, 1154 | "rxjs": { 1155 | "version": "7.5.4", 1156 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.4.tgz", 1157 | "integrity": "sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==", 1158 | "requires": { 1159 | "tslib": "^2.1.0" 1160 | } 1161 | }, 1162 | "safe-buffer": { 1163 | "version": "5.2.1", 1164 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1165 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1166 | }, 1167 | "safer-buffer": { 1168 | "version": "2.1.2", 1169 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1170 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1171 | }, 1172 | "signal-exit": { 1173 | "version": "3.0.7", 1174 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1175 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1176 | }, 1177 | "string_decoder": { 1178 | "version": "1.3.0", 1179 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1180 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1181 | "requires": { 1182 | "safe-buffer": "~5.2.0" 1183 | } 1184 | }, 1185 | "string-width": { 1186 | "version": "4.2.3", 1187 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1188 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1189 | "requires": { 1190 | "emoji-regex": "^8.0.0", 1191 | "is-fullwidth-code-point": "^3.0.0", 1192 | "strip-ansi": "^6.0.1" 1193 | } 1194 | }, 1195 | "strip-ansi": { 1196 | "version": "6.0.1", 1197 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1198 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1199 | "requires": { 1200 | "ansi-regex": "^5.0.1" 1201 | } 1202 | }, 1203 | "supports-color": { 1204 | "version": "7.2.0", 1205 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1206 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1207 | "requires": { 1208 | "has-flag": "^4.0.0" 1209 | } 1210 | }, 1211 | "through": { 1212 | "version": "2.3.8", 1213 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1214 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1215 | }, 1216 | "tmp": { 1217 | "version": "0.0.33", 1218 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1219 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1220 | "requires": { 1221 | "os-tmpdir": "~1.0.2" 1222 | } 1223 | }, 1224 | "tr46": { 1225 | "version": "0.0.3", 1226 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1227 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1228 | }, 1229 | "tslib": { 1230 | "version": "2.3.1", 1231 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1232 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" 1233 | }, 1234 | "type-fest": { 1235 | "version": "0.21.3", 1236 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1237 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" 1238 | }, 1239 | "typescript": { 1240 | "version": "4.6.2", 1241 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", 1242 | "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", 1243 | "dev": true 1244 | }, 1245 | "util-deprecate": { 1246 | "version": "1.0.2", 1247 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1248 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1249 | }, 1250 | "wcwidth": { 1251 | "version": "1.0.1", 1252 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 1253 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 1254 | "requires": { 1255 | "defaults": "^1.0.3" 1256 | } 1257 | }, 1258 | "webidl-conversions": { 1259 | "version": "3.0.1", 1260 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1261 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1262 | }, 1263 | "whatwg-url": { 1264 | "version": "5.0.0", 1265 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1266 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1267 | "requires": { 1268 | "tr46": "~0.0.3", 1269 | "webidl-conversions": "^3.0.0" 1270 | } 1271 | } 1272 | } 1273 | } 1274 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@create-anchor-app/cli", 3 | "version": "0.1.0", 4 | "description": "create anchor apps on the fly ", 5 | "main": "dist/index.js", 6 | "license": "MIT", 7 | "directories": { 8 | "lib": "lib" 9 | }, 10 | "scripts": { 11 | "dev": "npm run build && npm i . -g --force", 12 | "build": "tsc -p ." 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/create-anchor-app/cli.git" 17 | }, 18 | "bin": { 19 | "create-anchor-app": "./bin/index.js" 20 | }, 21 | "author": "ayush (https://ayush.sh)", 22 | "bugs": { 23 | "url": "https://github.com/create-anchor-app/cli/issues" 24 | }, 25 | "homepage": "https://github.com/create-anchor-app/cli#readme", 26 | "dependencies": { 27 | "@types/project-name-generator": "^2.1.1", 28 | "chalk": "4.1.2", 29 | "inquirer": "^8.2.0", 30 | "node-fetch": "^2.6.7", 31 | "node-stream-zip": "^1.15.0", 32 | "project-name-generator": "^2.1.9" 33 | }, 34 | "devDependencies": { 35 | "@types/inquirer": "^8.2.0", 36 | "@types/node-fetch": "2", 37 | "@types/unzipper": "^0.10.5", 38 | "typescript": "^4.4.3" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /site/Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/create-anchor-app/cli/70b2e32539c2cb961130283badd0d8a3083e3b59/site/Bold.otf -------------------------------------------------------------------------------- /site/api.json: -------------------------------------------------------------------------------- 1 | { 2 | "mint-nft": { 3 | "repo": "mint-nft", 4 | "install": "npm ci --force --progress=false" 5 | }, 6 | "stake-spl": { 7 | "repo": "stake-spl", 8 | "install": "npm ci --force --progress=false" 9 | }, 10 | "anchor-escrow": { 11 | "repo": "anchor-escrow", 12 | "install": "npm ci --force --progress=false" 13 | }, 14 | "nft-staking": { 15 | "repo": "nft-staking", 16 | "install": "npm ci --force --progress=false" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | create-anchor-app 4 |
5 |

create-anchor-app

6 |

use npm install @create-anchor-app/cli -g to get started!

7 | 8 |
-------------------------------------------------------------------------------- /site/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans:wght@300&display=swap'); 2 | 3 | @font-face { 4 | font-family: "Bold"; 5 | src: url("Bold.otf") format("opentype"); 6 | } 7 | 8 | /* @font-face { 9 | font-family: "Regular"; 10 | src: url("Regular.ttf") format("truetype"); 11 | } */ 12 | 13 | @keyframes load { 14 | from { 15 | opacity: 0; 16 | } 17 | 18 | to { 19 | opacity: 100; 20 | } 21 | } 22 | 23 | body { 24 | margin: 0; 25 | padding: 0; 26 | background-color: black; 27 | color: white; 28 | font-family: 'Noto Sans', sans-serif; 29 | } 30 | 31 | div { 32 | padding: 50px; 33 | font-size: 1.5em; 34 | } 35 | 36 | 37 | 38 | h1 { 39 | font-family: "Bold"; 40 | font-size: 50px; 41 | margin-top: 50px; 42 | animation-name: load; 43 | animation-duration: 2s; 44 | } 45 | 46 | p, 47 | li { 48 | animation-name: load; 49 | animation-duration: 3s; 50 | } 51 | 52 | a:link { 53 | color: red; 54 | } 55 | 56 | /* visited link */ 57 | a:visited { 58 | color: green; 59 | } 60 | 61 | /* mouse over link */ 62 | a:hover { 63 | color: hotpink; 64 | } 65 | 66 | /* selected link */ 67 | a:active { 68 | color: blue; 69 | } 70 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "outDir": "./bin", 6 | "rootDir": "lib", 7 | "strict": true, 8 | "moduleResolution": "node", 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true 12 | }, 13 | "exclude": ["site/**"] 14 | } 15 | --------------------------------------------------------------------------------