typescript-library-template
typescript-library-template
templateAn opinionated production-ready TypeScript library template with automated builds, testing, and releases.
Features
- π¦ Dual Package Support - Outputs CommonJS and ESM builds
- π‘οΈ Type Safety - Extremely strict TypeScript configuration
- β
Build Validation - Uses
@arethetypeswrong/cli
to check package exports - π§ͺ Automated Testing - Vitest with coverage reporting
- π¨ Code Quality - Biome linting and formatting with pre-commit hooks
- π Automated Releases - Semantic versioning with changelog generation
- βοΈ CI/CD Pipeline - GitHub Actions for testing and publishing
- π§ One-Click Setup - Automated repository configuration with
init.sh
script- ποΈ Repository rulesets - Branch protection with linear history and PR reviews
- π· Feature cleanup - Disable wikis, projects, squash/merge commits
- π Merge restrictions - Rebase-only workflow at repository and ruleset levels
- π Admin bypass - Repository administrators can bypass protection rules
- π Actions verification - Ensure GitHub Actions are enabled
- ποΈ Secrets validation - Check and guide setup of required secrets
Tech Stack
- TypeScript - Strict configuration for type safety
- Rollup - Builds both CommonJS and ESM formats
- Biome - Fast linting and formatting
- Vitest - Testing with coverage reports
- Husky - Pre-commit hooks for code quality
- Semantic Release - Automated versioning and releases
- pnpm - Fast package management with Corepack
- GitHub Actions - CI/CD pipeline
Setup
1. Use the template
Run this in your terminal GitHub CLI required
gh repo create my-typescript-library --clone --template neg4n/typescript-library-template --private && cd my-test-library
Setup via GitHub web interface
If for some reason you can't run the mentioned commands in your terminal, click the "Use this template βΎ" button below (or in the top right corner of the repository page)
2. Minimal Setup
Run the initialization script to automatically configure your repository:
# One-command setup
./init.sh
This script will:
- π Create repository rulesets for branch protection (linear history, PR reviews)
- π« Disable unnecessary features (wikis, projects, squash/merge commits)
- βοΈ Configure merge settings (rebase-only workflow at repository and ruleset levels)
- π€ Grant admin bypass permissions for repository administrators
- π§ Verify GitHub Actions and validate repository configuration
- π Check required secrets and provide setup instructions
3. Required Secrets
The script will guide you to set up these secrets if missing:
NPM_TOKEN (for publishing):
# Generate NPM token with OTP for enhanced security
pnpm token create --otp=<YOUR_OTP> --registry=https://registry.npmjs.org/
# Set the token as repository secret
gh secret set NPM_TOKEN --body "your-npm-token-here"
ACTIONS_BRANCH_PROTECTION_BYPASS (for automated releases):
# Create Personal Access Token with 'repo' permissions
# Visit: https://github.com/settings/personal-access-tokens/new
# Set the PAT as repository secret
gh secret set ACTIONS_BRANCH_PROTECTION_BYPASS --body "your-pat-token-here"
Scripts
Command | Description |
---|---|
pnpm dev | Watch mode build |
pnpm build | Production build |
pnpm build:check | Build + package validation |
pnpm test | Run tests |
pnpm test:watch | Watch mode testing |
pnpm test:coverage | Generate coverage report |
pnpm lint | Check linting and formatting |
pnpm lint:fix | Fix linting and formatting issues |
pnpm typecheck | TypeScript type checking |
pnpm release | Create release (CI only) |
FAQ
How do I modify the merging methods?
typescript-library-template
sets rebase-only at both repository and main branch levels. Here's how to modify this:
Current Setup
- Repository: Rebase merging only (squash/merge disabled)
- Main branch ruleset: Requires rebase merging
To Change Merge Methods
For repository-wide changes:
- Settings > General > Pull Requests - toggle merge methods
For branch-specific changes:
- Settings > Rules - edit the main branch ruleset's "Require merge type"
Precedence Rules
- Repository settings define what's available
- Rulesets add restrictions on top
- Most restrictive wins - if repository disallows a method but ruleset requires it, merging is blocked
Common Modifications
- Allow all methods: Enable squash/merge in repo settings + remove "Require merge type" from ruleset
- Squash-only: Change repo settings to squash-only OR keep current repo settings + change ruleset to require squash
- Different rules per branch: Create additional rulesets for other branch patterns
How to solve pnpm lockfile error on my CI/CD?
If you're seeing this error in your CI/CD (GitHub Actions) pipeline:
[...]
ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/package.json
[...]
Why This Happens
This template uses --frozen-lockfile
flag to ensure consistent installations in CI/CD. The error occurs when your package.json
has been modified but the pnpm-lock.yaml
hasn't been updated to match.
Solution
Run the following command locally:
pnpm install
This will:
- Update your
pnpm-lock.yaml
to match yourpackage.json
- Install any new dependencies
- Resolve version conflicts
Then commit the updated lockfile:
git add pnpm-lock.yaml
git commit -m "chore: update pnpm lockfile"
Why Linear History?
Linear history provides several benefits for library releases:
- Clean commit history - Easy to track changes and debug issues
- Simplified releases - Semantic release works better with linear commits
- Clear changelog - Each commit represents a complete change
- Better debugging -
git bisect
works more effectively - Consistent workflow - Forces proper PR review process
Contributing
See CONTRIBUTING.md for development workflow, commit conventions, and contribution guidelines.
License
The MIT License
More Projects
Explore other projects that might interest you
faviconize
π Library and CLI responsible for generating favicons in all formats and providing easy way to integrate them into your application
next-api-compose
𧬠Simple, dependency free, error aware and powerful utility to compose chain of multiple middleware into one Next.js API Route.
next-api-og-image
Easy way to generate open-graph images dynamically in HTML or React using Next.js API Routes. Suitable for serverless environment.