good-typescript-library-template
good-typescript-library-template
templateAn opinionated production-ready TypeScript library template with automated builds, testing, and releases.
And believe me. It is good.
Features
- π¦ Dual Package Support - Outputs CommonJS and ESM builds
- π‘οΈ Type Safety - Extremely strict TypeScript configuration
- π Always up-to-date deps - Renovate bot for CVE-aware automatic dependency updates
- β
Build Validation - Uses
@arethetypeswrong/clito 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.shscript- ποΈ 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/good-typescript-library-template --private && cd my-typescript-library
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) |
Renovate
renovate.json5 already turns onboarding off, so Renovate will start opening update PRs as soon as the GitHub App is installed. Enable it like this:
- Visit https://github.com/apps/renovate and click Install.
- Choose your personal account or organization, then pick All repos or Only select repos (include this one).
- Approve the requested permissions to finish installation. Renovate will run shortly after and open PRs based on
renovate.json5.
Notes:
- Want to stop it? Uninstall the app or set
"enabled": falseinrenovate.json5. - Need custom rules (schedules, groups, automerge)? Extend
renovate.json5- no extra onboarding PR is required.
FAQ
How do I modify the merging methods?
good-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.yamlto 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 bisectworks 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
bitf
A tiny and robust library to manage bitflags / bitsets / optionsets in TypeScript & JavaScript
faviconize
π Library and CLI responsible for generating favicons in all formats and providing easy way to integrate them into your application
image-square-wizard
image square wizard pads rectangular or panoramic images to a square canvas using libvips, auto measuring the domimant color with options to customize