Building an NPM package
André Casal
1 reply
If you're new here, I'm André, a tech entrepreneur and founder of LaunchFast, a stack designed to help web developers significantly speed up their project development time. I post daily updates on my journey and progress.
------------------------
Today I worked to improve the “npx -y launchfast” command. Here’s what got done:
1. Improved text colors
2. Added TS support
3. Added a stepper
4. Absorbed the input for folder input
5. Explained why the script needs a GitHub Private Access Token
6. Add support for multiple package managers (npm, yarn, pnpm)
7. Show the number of steps
## Improved text colors
One of the CLI UI components is called a note. A note has a title and a description. The description used to be faded out. I've improved the contrast ratio to make sure developers don't skip that section.
## Added TS support
I caught myself running the script 3 times in a row and having basic type errors, so I decided to use TypeScript.
Developing with TypeScript is such a breeze ♥️
You avoid running invalid code because all type errors are gone, you get auto-completion, and GitHub Copilot’s suggestions are better.
## Added a stepper
When you’re building a CLI, it’s often the case you need a stepper. This is a simple technique.
The steps variable is just an array of functions you call with a shared context, so they share data between themselves.
This allows me to isolate each step into its function, making the code more modular and manageable.
## Absorbed the input for folder input
When `npx -y launchfast` is done getting the info from the user, it runs `npx create-remix@latest`. Unfortunately, the create-remix command doesn’t have the best error validation for the folder name, failing when the user inserts an absolute path (without ./).
Luckily, create-remix accepts a folder name as an argument, so I ask the user (with proper validation) the name of the folder he wants to create and pass that down to the create-remix command.
Here’s what that looks like at the moment:
const command = `npx --yes create-remix@latest ${ctx.folderName} --package-manager ${ctx.packageManager} --git-init --install --init-script --template andrecasal/launch-fast-stack --token ${ctx.privateAccessToken}`
I’m happy my users don’t have to type that in manually 😄
## Explained why the script needs a GitHub Private Access Token
I was afraid of making the prompts too long.
I sacrificed clarity because of it.
But after hearing almost every developer wonder what the GitHub Private Access Token was for, I changed the prompt to something more obvious:
“We need a Private Access Token (PAT) to download the template. Open GitHub to create one (use the default read-only scope, scroll down, and press "Generate token")?”
## Add support for multiple package managers (npm, yarn, pnpm)
Adding support for multiple package managers was surprisingly easy.
It’s as easy as running `npm --version` and catching an exception.
Now the CLI supports installing LaunchFast with npm, yarn, or pnpm.
## Show the number of steps
A nice tip I’ve got from testing with users was to show the user where he was in the process. So I’ve added a “Step n/total: ”. This makes navigation and managing expectations considerably easier.
## Next Steps
Tomorrow I’ll try to make Fly’s CLI installation automatic. The challenge with this is not installing Fly’s CLI itself, but reloading the environment variables so that the `fly --version` command is recognized. I’ll let you know how I solve that.
Then I’ll apply all the other minor improvements to the CLI and test with new developers to see how they feel about it.
After that’s done, I’ll record a demo video to put on the landing page 🚀
That’s it, folks. I hope this post is useful to you. Feel free to dive into the open source code or ask me questions on 𝕏 in case you’re building an NPM package or a Remix Stack initialization script.
Cheers, and have a great weekend ♥️
Replies
André Casal@theandrecasal
LaunchFast
Here's the NPM package: https://www.npmjs.com/package/la...
Here's the repo: https://github.com/andrecasal/np...
Share