For developers contributing to the SDK or using it in advanced scenarios.
The SDK uses a service-based architecture with auto-generated code from OpenAPI:
┌───────────────────────────────────────────────┐
│ Application Code │
└───────────────────────┬───────────────────────┘
│
┌───────────────────────▼───────────────────────┐
│ PiSpiSDK (Main Class) │
│ - Configuration management │
│ - Error handling │
│ - Service orchestration │
└──────┬──────────┬──────────┬──────────┬───────┘
│ │ │ │
┌────▼────┐ ┌───▼───┐ ┌────▼────┐ ┌───▼─────┐
│ Comptes │ │ Alias │ │Paiements│ │ Webhooks│
│ Service │ │Service│ │ Service │ │ Service │
└────┬────┘ └───┬───┘ └────┬────┘ └───┬─────┘
│ │ │ │
┌────▼──────────▼──────────▼──────────▼────┐
│ Generated Services Layer │
└─────────────────────┬────────────────────┘
│
┌─────────────────────▼────────────────────┐
│ PI-SPI REST API │
│ (OAuth2 + mTLS Authentication) │
└──────────────────────────────────────────┘
- SDK Class (
src/sdk.ts): Main entry point, manages configuration and service instances - Service Wrappers (
src/services/): High-level service classes that wrap generated services - Generated Code (
src/generated/): Auto-generated from OpenAPI spec - Error Handling (
src/errors.ts,src/error-handler.ts): Custom error classes and handlers - Query Builder (
src/query-builder.ts): Helper for building complex filter queries
- Node.js >= 18.0.0
- pnpm (recommended) or npm
- PI-SPI API credentials
pnpm install
pnpm run generate
pnpm run buildpnpm run devThe SDK uses OpenAPI TypeScript Code Generator to generate types and services from openapi.json.
Process:
scripts/pre-generate.js- Validates OpenAPI specopenapi --input ./openapi.json --output ./src/generated- Generates codescripts/post-generate.js- Fixes empty types and configures defaults
To regenerate:
pnpm run generate- Ensure OpenAPI spec includes the endpoint
- Run
pnpm run generate - Update service wrapper in
src/services/[service-name].ts:
async newMethod(params: NewMethodParams): Promise<NewMethodResponse> {
return this.execute(async () => {
const { DefaultService } = await import('../generated');
return await DefaultService.newMethodEndpoint({ ...params });
});
}- Build:
pnpm run build
apps/sdks/pi-spi-sdk/
├── src/
│ ├── services/ # Service wrapper classes
│ ├── generated/ # Auto-generated (do not edit)
│ ├── sdk.ts # Main SDK class
│ ├── errors.ts # Error classes
│ └── query-builder.ts # Query builder
├── scripts/
│ ├── pre-generate.js # Pre-generation setup
│ └── post-generate.js # Post-generation fixes
├── cli/ # CLI tool
└── package.json
- Read main CONTRIBUTING.md
- Set up development environment
- Run
pnpm run generateif OpenAPI spec changed
- Use interfaces over types
- Avoid enums; use const objects or discriminated unions
- Wrap generated calls in
this.execute() - Add JSDoc comments for public methods
- Use custom error classes from
src/errors.ts
- Create feature branch
- Make changes following guidelines
- Generate code if OpenAPI spec changed:
pnpm run generate - Build:
pnpm run build - Update documentation if needed
- Update CHANGELOG.md
- Submit PR