{"id":24133355,"url":"https://github.com/s54a/s54a-init","last_synced_at":"2025-11-25T07:01:27.114Z","repository":{"id":228606380,"uuid":"774461753","full_name":"s54a/s54a-init","owner":"s54a","description":"Project Initializer || Template CLI","archived":false,"fork":false,"pushed_at":"2024-04-23T19:05:54.000Z","size":677,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-23T22:01:07.053Z","etag":null,"topics":["cli","cli-app","init","initializer","npm","npm-module","npm-package","projectinitializer","templatecli"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/@s54a/init","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/s54a.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-19T15:36:24.000Z","updated_at":"2024-04-23T19:02:23.000Z","dependencies_parsed_at":"2024-04-23T20:55:03.357Z","dependency_job_id":null,"html_url":"https://github.com/s54a/s54a-init","commit_stats":null,"previous_names":["s54a/s54a-init"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s54a%2Fs54a-init","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s54a%2Fs54a-init/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s54a%2Fs54a-init/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/s54a%2Fs54a-init/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/s54a","download_url":"https://codeload.github.com/s54a/s54a-init/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241348197,"owners_count":19948157,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cli-app","init","initializer","npm","npm-module","npm-package","projectinitializer","templatecli"],"created_at":"2025-01-11T23:36:40.656Z","updated_at":"2025-11-25T07:01:27.023Z","avatar_url":"https://github.com/s54a.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n**Table of Contents** _generated with [DocToc](https://github.com/thlorenz/doctoc)_\n\n- [@s54a/init || TempLate CLI || Project Initializer](#s54ainit--template-cli--project-initializer)\n  - [How it Works](#how-it-works)\n  - [Video Tutorial](#video-tutorial)\n  - [Folder Structure](#folder-structure)\n  - [Installation](#installation)\n  - [Usage](#usage)\n    - [Example](#example)\n    - [Example](#example-1)\n    - [Example](#example-2)\n    - [Example](#example-3)\n    - [Example](#example-4)\n    - [Example](#example-5)\n  - [Resources](#resources)\n    - [These are the YouTube Videos \u0026 Article which helped me build this](#these-are-the-youtube-videos--article-which-helped-me-build-this)\n  - [Read this if you are a beginner](#read-this-if-you-are-a-beginner)\n  - [Why I Created this](#why-i-created-this)\n  - [How I use this Package](#how-i-use-this-package)\n  - [Extra Info](#extra-info)\n  - [Source Code](#source-code)\n    - [index.js](#indexjs)\n    - [package.json](#packagejson)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n# @s54a/init || TempLate CLI || Project Initializer\n\nWhen I was starting a new project, I used the 'create vite app' command. Then, I began to remove and add files for the project. It struck me that I could create it once and paste it everywhere when I start a new project. Thats how I started building this.\n\n_There are two branch of this project in this one I have removed images \u0026 a few files to reduce the size_\n\n_Visit the NPM Readme to see examples_\n\n## How it Works\n\nThe package stores Templates inside a folder called \"Templates\" then when you run the `init` command it displays the templates and then it will paste the folder at the location where the terminal is open.\n\n_Simply it just copies \u0026 pastes the Folders from one place to another_\n\n## Video Tutorial\n\n[![Video Tutorial](./images/init%20-h.png)](https://www.youtube.com/watch?v=fmWuOmyIZLc)\n\n## Folder Structure\n\n    📁 init\n    ├── 🌅 images\n    │   ├── 🖼️ article.png\n    │   ├── 🖼️ init -a.png\n    │   ├── 🖼️ init -c.png\n    │   ├── 🖼️ init -h.png\n    │   ├── 🖼️ init -r.png\n    │   └── 🖼️ init.png\n    ├── 📁 templates\n    │   └── 📁 templateTest\n    │       ├── 📄 index.html\n    │       ├── 📄 main.js\n    │       └── 📄 style.css\n    ├── 📄 .gitignore\n    ├── 📄 .npmignore\n    ├── 📄 index.js\n    ├── 📜 LICENSE\n    ├── 📝 Readme.md\n    ├── 📋 package.json\n    └── 📋 package-lock.json\n\nFor testing purposes, only one template has been included, consisting of three files _(HTML, CSS \u0026 JS)_. Additional templates have not been added to avoid making the package unnecessarily large.\n\n_(Note ChatGPT built this folder structure)_\n\n## Installation\n\nThis package provides an Executable Command\n\nYou will have to install this package globally to be able to use the `init` command.\n\n```bash\nnpm install -g @s54a/init\n```\n\n## Usage\n\nTo begin, open a terminal at the desired project location and run this command\n\n```bash\ninit\n```\n\n##### Example\n\n![init](./images/init.png)\n\nThis displays all available templates from the template folder, listed by folder name. Choose a template and enter the desired folder name when prompted to create a new project with the selected template's contents.\n\n**Users can also create templates themselves by running:**\n\n```bash\ninit -a \"C:\\Users\\{User}\\Desktop\\Projects\\Ongoing Projects\"\n```\n\n##### Example\n\n![init](./images/init%20-a.png)\n\nUpon execution, the tool generates a new folder path containing the contents of the user-created template. Subsequently, when the init command is invoked, it showcases the recently created template under the specified name.\n\n_Tip_: For Windows users, you can quickly access the folder by selecting it and then pressing `ctrl + shift + c`.\n\n**By Default when you create a Template it skips the `node_modules` folder and its contents.**\n\n_But for reason you want to create a template with `node_modules` folder you will have to pass the `-y` flag._\n\n```bash\ninit -a \"O:\\test\\cliTest\" -y\n```\n\n##### Example\n\n![init](./images/init%20-y.png)\n\n**Templates can be removed using the following command:**\n\n```bash\ninit -r \"template name\"\n```\n\n##### Example\n\n![init](./images/init%20-r.png)\n\n_(Note: The name must match exactly.)_\n\n**Templates can also be added from GitHub with:**\n\n```bash\ninit -c \"https://github.com/user/repoitoryName.git\"\n```\n\n##### Example\n\n![init](./images/init%20-c.png)\n\nThis process involves cloning the repository into the current terminal directory, removing the .git folder from the cloned repository, executing the init -a \"repoName\" command to create a copy in the templates folder, and then deleting the cloned repository folder from the current terminal location.\n\nI have used this Regex to verify if the given string is a link or not.\n\n```js\nconst urlRegex =\n  /^(https?|ftp):\\/\\/(([a-z\\d]([a-z\\d-]*[a-z\\d])?\\.)+[a-z]{2,}|localhost)(\\/[-a-z\\d%_.~+]*)*(\\?[;\u0026a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$/i;\n```\n\nThe reason it performs all these steps is because I attempted to accomplish it in a simpler manner but couldn't find one.\n\n**To see all the Commands (Help)**\n\n```bash\ninit -h\n```\n\n##### Example\n\n![init](./images/init%20-h.png)\n\n## Resources\n\n#### These are the YouTube Videos \u0026 Article which helped me build this\n\n[![The Article Link](./images/article.png)](https://medium.com/northcoders/creating-a-project-generator-with-node-29e13b3cd309)\n\n[![The Video Link](https://img.youtube.com/vi/xYko2bHNgVA/0.jpg)](https://www.youtube.com/watch?v=xYko2bHNgVA)\n\n[![The Video Link](https://img.youtube.com/vi/UxdSoefSxrA/sddefault.jpg)](https://www.youtube.com/watch?v=UxdSoefSxrA)\n\n\u0026 ChatGPT\n\nThis a similar project built with Typescript\nhttps://github.com/pongsatt/mycli/blob/master/src/index.ts\n\nExtra Resources\nhttps://github.com/lirantal/nodejs-cli-apps-best-practices\n\nTake a look at https://yeoman.io/generators/\n\n## Read this if you are a beginner\n\nI asked one of my friend who is a beginner in Web Dev. She asked me a question how will I make templates or why use this instead of **Copy Pasting**\n\nSo when ever you do\n\n```bash\nnpm create-react-app ProjectName\n```\n\nor\n\n```bash\nnpm create-vite-app ProjectName\n```\n\nThese files are generated (with create react app)\n\n    my-app/\n    ├── README.md\n    ├── node_modules/\n    ├── package.json\n    ├── .gitignore\n    ├── public/\n    │   ├── favicon.ico\n    │   ├── index.html\n    │   ├── manifest.json\n    │   └── robots.txt\n    └── src/\n    ├── App.css\n    ├── App.js\n    ├── App.test.js\n    ├── index.css\n    ├── index.js\n    └── logo.svg\n\nAs you can see there are so many files which aren't necessary so you will have to remove these files remove code from `index.css` or maybe more files.\n\nSo you can do this once and use this template by using this package or just copy paste.\n\n**So why use this package instead of copy pasting**\nSo assume you have created many templates now you will create a folder to store them and every time you will start a new project you will have to go to that location copy that file and paste it at the location where you are starting the project and then change the name.\n\nSo this package does all that when you create a template and add it as a template from Command Line Interface and what I have learned \u0026 heard is **that you will much faster at things with CLI then GUI**.\n\n## Why I Created this\n\nWhen you start Learning to code you will create multiple new projects so every time you will have to create new files\n\ne.g. index.html, style.css, app.js\n\nWhen you will advance to React you will do\n\nSo every time you will do that you will have to remove files edit content of the files.\n\nSo I thought it is a hassle so lets just do it once and I wil copy \u0026 paste it every time whenever I start a new project.\n\nThen I thought I can create a cli which does that for me \u0026 I started building this package.\n\nThen on a suggestion of a friend I also added the Clone \u0026 Create Template from Github Feature.\n\n## How I use this Package\n\nI use this Package whenever I start a new project.\n\nI have created my own template and added them as templates using `init -a \"folder path\"` command.\n\nI have also added templates on Github.\n\nSo if I am on a new device or format my current one so I can just run the `init -c \"github_url\"` command after installing the package to clone new project and create a new template.\n\nSo if you are a Freelancer or Someone who is learning to code, or starting a new Project you can use this.\n\n## Extra Info\n\nWhile Deploying Packages on NPM I realized that whatever you have in your project will get included even if you use npm ignore.\nI don't know if npm ignore works or failed.\nSo I created another branch of this project in which I removed images and extra files.\nTo reduce the size of the package \u0026 the node_modules size.\n\nHere is the difference\n\n![size difference](./images/big.png)\n![size difference](./images/small.png)\n\n**So the Package Size is reduced by 300 Kilo Bytes**\n\n## Source Code\n\nEvery time when I look at the open source I feel it is a hassle to navigate around files to see the code.\n\nAnd this project source code is in a single file.\n\nSo I am adding the source code in the markdown file so you can read it all in one place.\n\n### index.js\n\n```js\n#!/usr/bin/env node\n\nimport inquirer from \"inquirer\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { execSync } from \"child_process\";\nimport chalk from \"chalk\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst CHOICES = fs.readdirSync(path.join(__dirname, \"templates\"));\n\nconst QUESTIONS = [\n  {\n    name: \"project-choice\",\n    type: \"list\",\n    message: \"What project template would you like to generate?\",\n    choices: CHOICES,\n  },\n  {\n    name: \"project-name\",\n    type: \"input\",\n    message: \"Project name:\",\n    validate: function (input) {\n      if (/^([A-Za-z\\-\\_\\d])+$/.test(input)) return true;\n      else\n        return \"Project name may only include letters, numbers, underscores and hashes.\";\n    },\n  },\n];\n\nconst CURR_DIR = process.cwd();\n\nlet nodeFlag = false; // Set nodeFlag as a global variable with a default value of false\n\n// Command line arguments\nconst [, , condition, folderPath, nodeFlagParam] = process.argv;\n\nconst [, , ...args] = process.argv;\n\nconst options = {\n  condition: null,\n  folderPathOrNameOrLink: null,\n  nodeFlagParam: \"\",\n};\n\n// Parse command line arguments\nfor (let i = 0; i \u003c args.length; i++) {\n  const arg = args[i];\n  switch (arg) {\n    case \"-a\":\n    case \"-r\":\n    case \"-c\":\n      options.condition = arg;\n      break;\n    case \"-h\":\n      options.condition = arg;\n      options.folderPathOrNameOrLink = \"\";\n      break;\n    case \"-y\":\n      // Check if the previous option was '-a'\n      if (options.condition === \"-a\") {\n        options.nodeFlagParam = arg;\n      } else {\n        console.error(`Invalid usage of '-y' flag.`);\n        process.exit(1);\n      }\n      break;\n    default:\n      if (arg.startsWith(\"-\")) {\n        console.error(`Invalid option: ${arg}`);\n        process.exit(1);\n      } else {\n        options.folderPathOrNameOrLink = arg;\n      }\n      break;\n  }\n}\n\nif (!args.length) {\n  options.condition = \"\";\n  options.folderPathOrNameOrLink = \"\";\n}\n\n// Check for unsupported or invalid options\nif (Object.values(options).some((value) =\u003e value === null)) {\n  console.error(`Missing required option or invalid usage.`);\n  process.exit(1);\n}\n\n// Update the value of nodeFlag based on the command line argument\nif (nodeFlagParam === \"-y\") {\n  nodeFlag = true;\n}\n\nfunction createDirectoryContents(templatePath, newProjectPath) {\n  const filesToCreate = fs.readdirSync(templatePath);\n\n  filesToCreate.forEach((file) =\u003e {\n    const origFilePath = path.join(templatePath, file);\n\n    // get stats about the current file\n    const stats = fs.statSync(origFilePath);\n\n    if (stats.isFile()) {\n      const contents = fs.readFileSync(origFilePath, \"utf8\");\n\n      // Rename\n      if (file === \".npmignore\") file = \".gitignore\";\n\n      if (condition === \"-a\") {\n        fs.writeFileSync(\n          path.join(__dirname, \"templates\", newProjectPath, file),\n          contents,\n          \"utf8\"\n        );\n      } else {\n        fs.writeFileSync(\n          path.join(CURR_DIR, newProjectPath, file),\n          contents,\n          \"utf8\"\n        );\n      }\n    } else if (stats.isDirectory()) {\n      if (condition === \"-a\") {\n        if (file === \"node_modules\" \u0026\u0026 !nodeFlag) {\n          return;\n        } else {\n          fs.mkdirSync(path.join(__dirname, \"templates\", newProjectPath, file));\n        }\n      } else {\n        fs.mkdirSync(path.join(CURR_DIR, newProjectPath, file));\n      }\n\n      // Then recursively copy contents\n      createDirectoryContents(\n        path.join(templatePath, file),\n        path.join(newProjectPath, file)\n      );\n    }\n  });\n}\n\nif (!condition) {\n  inquirer.prompt(QUESTIONS).then((answers) =\u003e {\n    const projectChoice = answers[\"project-choice\"];\n    const projectName = answers[\"project-name\"];\n    const templatePath = path.join(__dirname, \"templates\", projectChoice);\n    const projectPath = path.join(CURR_DIR, projectName);\n\n    // Create project directory if it doesn't exist\n    if (!fs.existsSync(projectPath)) {\n      fs.mkdirSync(projectPath);\n    } else {\n      console.log(`\\nProject directory '${projectName}' already exists.`);\n      {\n        process.exit(1);\n      }\n    }\n\n    createDirectoryContents(templatePath, projectName);\n    console.log(\"\\nTemplate successfully created.\");\n  });\n} else if (condition === \"-a\") {\n  // Validate folder path\n  if (!folderPath) {\n    console.error(\"\\nError: provide a folder path.\");\n    {\n      process.exit(1);\n    }\n  }\n\n  // Validate folder existence\n  if (!fs.existsSync(folderPath)) {\n    console.error(\"\\nError: Folder does not exist.\");\n    {\n      process.exit(1);\n    }\n  }\n\n  // Create project name from folder path\n  const projectName = path.basename(folderPath);\n\n  // Create directory for new project if it doesn't exist\n  const templateFolderPath = path.join(__dirname, \"templates\", projectName);\n  if (!fs.existsSync(templateFolderPath)) {\n    fs.mkdirSync(templateFolderPath);\n  } else {\n    console.log(`\\nFolder '${templateFolderPath}' already exists.`);\n    {\n      process.exit(1);\n    }\n  }\n\n  // Copy contents from folderPath to projectName/template\n  createDirectoryContents(folderPath, projectName);\n\n  // InformSync user about successful operation\n  if (nodeFlag) {\n    console.log(\"\\nTemplate successfully created with node_modules.\");\n  } else {\n    console.log(\"\\nTemplate successfully created.\");\n  }\n} else if (condition === \"-r\") {\n  const templateToRemove = process.argv[3];\n\n  // Validate if the template exists\n  const templatePathToRemove = path.join(\n    __dirname,\n    \"templates\",\n    templateToRemove\n  );\n  if (!fs.existsSync(templatePathToRemove)) {\n    console.error(`\\nError: Template '${templateToRemove}' does not exist.`);\n    {\n      process.exit(1);\n    }\n  }\n\n  // Remove the template directory\n  fs.rmSync(templatePathToRemove, { recursive: true });\n\n  // InformSync user about successful operation\n  console.log(`\\nTemplate '${templateToRemove}' was successfully removed.`);\n} else if (condition === \"-c\") {\n  const runCommand = (command) =\u003e {\n    return new Promise((resolve, reject) =\u003e {\n      try {\n        execSync(command, { stdio: \"inherit\" });\n        resolve(); // Resolve the promise when the command completes successfully\n      } catch (error) {\n        console.error(`Failed to Execute ${command}`, error);\n        reject(error); // Reject the promise with the error if the command fails\n      }\n    });\n  };\n\n  const urlRegex =\n    /^(https?|ftp):\\/\\/(([a-z\\d]([a-z\\d-]*[a-z\\d])?\\.)+[a-z]{2,}|localhost)(\\/[-a-z\\d%_.~+]*)*(\\?[;\u0026a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$/i;\n\n  const repoLink = process.argv[3];\n\n  if (!urlRegex.test(repoLink)) {\n    console.log(\"Invalid repository link provided.\");\n    process.exit(1);\n  } else {\n    console.log(\"Repository link is valid.\");\n  }\n  const gitCommand = `git clone --depth 1 ${repoLink}`;\n  let projectName;\n\n  // Check if a changed name is provided in the clone command\n  if (repoLink.includes(\" \")) {\n    // Extract the project name from the clone command\n    const cloneCommandParts = repoLink.split(\" \"); // Split the clone command by whitespace\n    projectName = cloneCommandParts[cloneCommandParts.length - 1]; // Get the last part as the project name\n  } else {\n    // Extract the project name from the repository link\n    projectName = path.basename(repoLink, \".git\");\n  }\n\n  runCommand(gitCommand)\n    .then(async () =\u003e {\n      console.log(\"\\nRepository Cloned\");\n\n      // Remove the .git folder\n      const clonedFolderPath = path.join(CURR_DIR, projectName);\n      const gitFolderPath = path.join(clonedFolderPath, \".git\");\n      if (fs.existsSync(gitFolderPath)) {\n        await fs.promises.rm(gitFolderPath, { recursive: true });\n      }\n\n      // Run the 'init -a' command with the cloned folder path\n      const initCommand = `init -a \"${clonedFolderPath}\"`;\n      await runCommand(initCommand);\n\n      // Remove the cloned project folder asynchronously\n      try {\n        await fs.promises.rm(clonedFolderPath, { recursive: true });\n      } catch (error) {\n        console.error(`Failed to remove cloned folder: ${error}`);\n      }\n    })\n    .catch((error) =\u003e {\n      console.error(\"Error cloning repository:\", error);\n      process.exit(1); // Exit the script with an error status code\n    });\n} else if (condition === \"-h\") {\n  // Clear the terminal by printing ANSI escape codes\n  process.stdout.write(\"\\u001b[2J\\u001b[0;0H\");\n\n  const message = `\n${chalk.bold.underline.white(\"Package Commands:\")}\n\n    ${chalk.green(\"Create a New Template:\")}\n      - Type ${chalk.cyan(\"'init'\")} and press Enter at your desired location.\n\n    ${chalk.green(\"Add a Template:\")}\n      - Use the ${chalk.cyan(\n        \"-a\"\n      )} flag followed by the path in quotes. By default it skips the node_modules folder.\n      ${chalk.yellow(\"Example:\")} ${chalk.cyan(\"init -a\")} ${chalk.yellow(\n    '\"C:\\\\Users\\\\{User}\\\\Desktop\\\\Projects\\\\Ongoing Projects\"'\n  )}\n      - But if you want to add node_modules folder with the template you are creating then ${chalk.cyan(\n        \"-y\"\n      )} flag after the command.\n      ${chalk.yellow(\"Example:\")} ${chalk.cyan(\"init -a\")} ${chalk.yellow(\n    '\"C:\\\\Users\\\\{User}\\\\Desktop\\\\Projects\\\\Ongoing Projects\"'\n  )} ${chalk.cyan(\"-y\")}\n\n    ${chalk.green(\"Clone a Repository and Add as a Template:\")}\n      - Use the ${chalk.cyan(\n        \"-c\"\n      )} flag followed by the repository link in quotes.\n      ${chalk.yellow(\"Example:\")} ${chalk.cyan(\"init -c\")} ${chalk.yellow(\n    '\"https://github.com/user/repoitoryName\"'\n  )}\n\n    ${chalk.green(\"Remove a Template:\")}\n    - Use the ${chalk.cyan(\n      \"-r\"\n    )} flag followed by the exact name of the template in quotes.\n      ${chalk.yellow(\"Example:\")} ${chalk.cyan(\"init -r\")} ${chalk.yellow(\n    '\"Template Name\"'\n  )}\n        \n    ${chalk.green(\"Help:\")}\n    - Use ${chalk.cyan(\"init -h\")} to see help.\n\n\n    Made By Sooraj Gupta\n    Email : soorajgupta00@gmail.com\n    Github Repository : https://github.com/s54a/s54a-init\n\n`;\n\n  console.log(message);\n} else if (condition) {\n  console.log(\n    chalk.red(\n      `\n      Invalid command: \"${condition}\".\n      \n      Please use one of the supported commands.\n      \n      Run ${chalk.yellow(\"init -h\")} to see help.\n      \n      `\n    )\n  );\n} else {\n  console.log(\n    chalk.red(\n      `An error occurred or an invalid command was provided.\n      Run ${chalk.yellow(\"init -h\")} to see help.`\n    )\n  );\n}\n```\n\n### package.json\n\n```json\n{\n  \"name\": \"@s54a/init\",\n  \"version\": \"5.0.0\",\n  \"description\": \"Project Initializer\",\n  \"main\": \"./index.js\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" \u0026\u0026 exit 1\"\n  },\n  \"bin\": {\n    \"init\": \"index.js\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/s54a/s54a-init.git\"\n  },\n  \"keywords\": [\"Project Initializer\", \"Initializer\", \"Init\"],\n  \"author\": \"Sooraj Gupta\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"chalk\": \"^5.3.0\",\n    \"inquirer\": \"^9.2.15\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/s54a/s54a-init/issues\"\n  },\n  \"homepage\": \"https://github.com/s54a/s54a-init#readme\"\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs54a%2Fs54a-init","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fs54a%2Fs54a-init","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fs54a%2Fs54a-init/lists"}