Report Bugs
Found a bug? Open an issue with reproduction steps.
Thank you for your interest in contributing to QZPay! This guide will help you get started.
Report Bugs
Found a bug? Open an issue with reproduction steps.
Suggest Features
Have an idea? Start a discussion or open a feature request.
Improve Docs
Fix typos, add examples, or improve explanations.
Write Code
Fix bugs, add features, or create new adapters.
Fork the repository
Click the “Fork” button on GitHub.
Clone your fork
git clone https://github.com/YOUR_USERNAME/qzpay.gitcd qzpayInstall dependencies
pnpm installCreate a branch
git checkout -b feature/your-feature-name# orgit checkout -b fix/your-bug-fixMake your changes
Write your code following the guidelines below.
Run tests
pnpm testSubmit a pull request
Push your branch and open a PR against main.
qzpay/├── packages/│ ├── core/ # Core billing engine│ ├── stripe/ # Stripe adapter│ ├── mercadopago/ # MercadoPago adapter│ ├── drizzle/ # Drizzle storage adapter│ ├── react/ # React components│ ├── hono/ # Hono integration│ ├── nestjs/ # NestJS module│ └── cli/ # CLI tool├── apps/│ └── docs/ # Documentation site├── examples/ # Example implementations└── .claude/ # AI assistant configuration# Developmentpnpm dev # Start all packages in dev modepnpm dev --filter @qazuor/qzpay-core # Dev specific package
# Testingpnpm test # Run all testspnpm test --filter @qazuor/qzpay-core # Test specific packagepnpm test:coverage # Run with coverage
# Buildingpnpm build # Build all packagespnpm typecheck # Type check all packages
# Lintingpnpm lint # Lint all packagespnpm lint:fix # Auto-fix lint issues
# Documentationpnpm docs # Start docs dev server/** * Creates a new customer in the billing system. * * @param input - Customer creation parameters * @returns The created customer * @throws {ValidationError} If input is invalid * * @example * ```typescript * const customer = await billing.customers.create({ * email: 'user@example.com', * name: 'John Doe' * }); * ``` */async create(input: CreateCustomerInput): Promise<Customer> { // ...}const over letdescribe('customers.create', () => { it('creates a customer with email and name', async () => { // Arrange const input = { email: 'test@example.com', name: 'Test User' };
// Act const customer = await billing.customers.create(input);
// Assert expect(customer.email).toBe(input.email); expect(customer.name).toBe(input.name); expect(customer.id).toMatch(/^cus_/); });
it('throws ValidationError for invalid email', async () => { await expect( billing.customers.create({ email: 'invalid' }) ).rejects.toThrow(ValidationError); });});Follow Conventional Commits:
type(scope): description
[optional body]
[optional footer]Types:
feat: New featurefix: Bug fixdocs: Documentation changesstyle: Code style changes (formatting)refactor: Code refactoringtest: Adding or updating testschore: Maintenance tasksExamples:
feat(core): add subscription pause functionalityfix(stripe): handle webhook signature with raw bodydocs(react): add PricingTable customization examplespnpm test)pnpm lint)pnpm typecheck)Use the same format as commits:
feat(core): add subscription pause functionalityInclude:
See the Creating Adapters guide for detailed instructions.
Key points:
PaymentProvider interfaceImplement the BillingStorage interface:
docs/├── en/ # English (primary)│ ├── getting-started/│ ├── concepts/│ ├── guides/│ ├── packages/│ ├── api/│ ├── resources/│ └── community/└── es/ # Spanish (translation)astro.config.mjsContributors are recognized in:
Thank you for helping make QZPay better!