Introduction
I am building a CLI tool that lets you add features into your project via CLI. This CLI tool currently only supports adding features in a Next.js based projects. The idea is to run a command like
pnpx thinkthroo@latest add supabase-auth
or
pnpx thinkthroo@latest add s3-upload
and this would add the files required.
I have broken down the process into parts and share the steps involved and write about my experience in setting up a CLI tool through this articles.
Create a project
I have referenced this article — How to write a TypeScript Library to set up this project but I had my own touch inspired by shadcn/ui CLI since what I am building is also a CLI tool.
Create folder
My project — Think Throo is a monorepo and has packages folder. Similar to Shadcn/ui, I created a folder name thinkthroo
Run npm init
I navigated to this folder and initialised by running the below command:
npm init
You will be prompted with some questions, I answered them like shown below:
Setup tsconfig.json
I created a file named tsconfig.json and copied the contents from shadcn/ui’s tsconfig.json.
{ "$schema": "https://json.schemastore.org/tsconfig", "extends": "@repo/typescript-config/ts-library.json", "compilerOptions": { "isolatedModules": false, "resolveJsonModule": true, "baseUrl": ".", "paths": { "@/*": ["./*"] } }, "include": ["src/**/*.ts"], "exclude": ["node_modules", "test/fixtures"] }
The difference is the way I am importing the extends
. Since my setup is a monorepo, I would now have to add @repo/typescript-config
as dependency in package.json. Read more about Turborepo.
"devDependencies": { "@repo/typescript-config": "*" }
And run npm install
. I did not use pnpm
as my package manager, Shadcn uses pnpm
as its package manager.
When you setup a monorepo using turbo, the basic template gives you 3 packages by default. This can be found in turborepo/examples/basic.
Finally, I created another file named ts-library.json
in typescript-config that is imported in my CLI tool, thinkthroo and updated its code to what is shown below:
{ "$schema": "https://json.schemastore.org/tsconfig", "display": "Default", "compilerOptions": { "composite": false, "declaration": true, "declarationMap": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "inlineSources": false, "isolatedModules": true, "moduleResolution": "node", "noUnusedLocals": false, "noUnusedParameters": false, "preserveWatchOutput": true, "skipLibCheck": true, "strict": true }, "exclude": ["node_modules"] }
I copied this content from shadcn-ui/tsconfig.json, the one you find at the root level.
You will find some other files in this typescript-config.
These are created at the time of setting up the monorepo. I might remove this package in the future releases if I do not see a need, but for now I am going to just leave it there.
Conclusion:
So far, we have created two files
package.json
tsconfig.json
You will find this code in this commit
The next part is to setup tsup to bundle your typescript.
About me:
Hey, my name is Ramu Narasinga. I study large open-source projects and create content about their codebase architecture and best practices, sharing it through articles, videos.
I am open to work on interesting projects. Send me an email at ramu.narasinga@gmail.com
My Github — https://github.com/ramu-narasinga
My website — https://ramunarasinga.com
My Youtube channel — https://www.youtube.com/@ramu-narasinga
Learning platform — https://thinkthroo.com
Codebase Architecture — https://app.thinkthroo.com/architecture
Best practices — https://app.thinkthroo.com/best-practices
Production-grade projects — https://app.thinkthroo.com/production-grade-projects
Top comments (0)