Skip to content

Contributing to otplib

Thank you for your interest in contributing to otplib! This guide covers everything you need to get started.

Development Setup

Environment

  • Node.js >= 24.0.0
  • pnpm >= 10.30.1

Getting Started

bash
# Clone the repository
git clone https://github.com/yeojz/otplib.git
cd otplib

# Install dependencies
pnpm install

Common Commands

bash
# Development
pnpm install          # Install dependencies
pnpm build            # Build all packages (required before testing)
pnpm test             # Run all tests
pnpm test:ci          # Run tests with coverage
pnpm fix              # Lint + format (run before commits)
pnpm typecheck        # TypeScript validation

# Single package testing
pnpm --filter @otplib/core test -- --project packages
pnpm --filter otplib-cli test -- --project otplib-cli

# Run specific test file
pnpm vitest run packages/core/src/utils.test.ts

# Multi-runtime distribution tests (See #Testing)
pnpm test:dist-bun    # Bun distribution tests
pnpm test:dist-deno   # Deno distribution tests
# OR
pnpm test:docker bun-1

# Documentation
pnpm docs:dev         # Start docs dev server. (Requires a manual pnpm run build before running)
pnpm docs:build       # Build documentation

# Other
pnpm size             # Check bundle sizes

Project Structure

  • packages/ - Published packages in the otplib ecosystem (core, hotp, totp, uri, otplib bundle, crypto/base32 plugins)
  • apps/ - Applications built on top of packages/ (docs site, CLI)
  • internal/ - Internal tooling, not published (distribution tests, benchmarks, fuzz tests, test utilities)

Testing Requirements

  • packages/
    • 100% test coverage strictly required
    • Test must pass on all supported runtimes and environments.
  • apps/
    • Test must pass tests. Preferably reaching full coverage.
    • Coverage thresholds dependent on application.
    • Strive for full coverage and provide reason for deciding not to.

Test Types

Unit Tests (packages/*/src/*.test.ts)

  • Test source code directly using Vitest
  • Run with pnpm test or pnpm test:ci (with coverage)

Distribution Tests (internal/distribution-tests/)

  • Test built artifacts (dist/) across Node.js 20/22/24, Deno, and Bun
  • Ensures published packages work correctly in all target runtimes
  • Run with pnpm build && pnpm test:dist-node

Local Testing

bash
# Unit tests (source code)
pnpm test
pnpm test:ci          # with coverage

# Distribution tests (built artifacts)
pnpm build            # Required: build packages first
pnpm test:dist-node   # Node.js distribution tests
pnpm test:dist-bun    # Bun distribution tests (requires Bun)
pnpm test:dist-deno   # Deno distribution tests (requires Deno)

Docker-based Multi-Runtime Testing

Since this library supports multiple runtimes (Bun 1.x, Deno 1.x/2.x, Node 20/22/23), you can use Docker to test across all environments without installing them locally:

bash
# Test a specific runtime
./scripts/test-docker.sh node-20
./scripts/test-docker.sh bun
./scripts/test-docker.sh deno-2

# Test all runtimes
./scripts/test-docker.sh all

Available runtimes: bun-1, deno-1, deno-2, node-20, node-22, node-24

See tests/docker-compose.test.yml for configuration details.

Making Changes

Branching Strategy

  • Create feature branches from main
  • Use descriptive branch names: feat/add-feature, fix/issue-123, docs/update-guide

Code Style

  • TypeScript strict mode enabled
  • ESLint and Prettier for formatting
  • Run pnpm fix before committing

Commit Messages

Follow conventional commits:

feat: add new feature
fix: resolve issue with token generation
docs: update API documentation
test: add edge case tests
refactor: simplify validation logic
chore: update dependencies

Pull Request Guidelines

  1. Create an issue first for significant changes
  2. Keep PRs focused - one feature or fix per PR
  3. Include tests for new functionality
  4. Update documentation if adding/changing APIs
  5. Run all checks before submitting:
    bash
    pnpm fix && pnpm typecheck && pnpm test:ci

PR Checklist

  • [ ] Tests pass (pnpm test:ci)
  • [ ] Coverage thresholds met (if applicable) (pnpm test:ci)
  • [ ] Types check (pnpm typecheck)
  • [ ] Linting passes (pnpm lint)
  • [ ] Code formatted (pnpm format)
  • [ ] Documentation updated (if applicable)

Release Process (For Maintainers)

Releases are managed by maintainers:

  1. Merge PRs: Review and merge contributor PRs to main
  2. Version Bump: Update package versions in package.json files as needed
  3. Publish: Trigger the Publish to npm workflow via workflow_dispatch (Actions tab) to build and publish packages

AI Usage Guidelines

Code or other content generated in whole or in part using AI tools can be contributed to the project, provided that it satisfies the following conditions:

AI Tool Terms Compatibility

  • Ensure the AI tool's terms don't conflict with the project's open source license, IP policies, or Open Source Definition

Third-Party Content in AI Output

  • Verify permission to use any third-party copyrighted materials (e.g., via compatible open source license or public domain)
  • Provide attribution and license information for any third-party content included

Responsible AI Usage

  • You are responsible for reviewing, testing, and verifying any AI-assisted changes.
  • If AI tools generated significant parts of your contribution, mention this in your PR so reviewers can provide appropriate guidance.

Questions?

License

By contributing, you agree that your contributions will be licensed under the MIT License.

Released under the MIT License.