Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ npx skills add pachca/openapi
| [Go](sdk/go/README.md) | `github.com/pachca/go-sdk` | Go modules |
| [Kotlin](sdk/kotlin/README.md) | `com.pachca:sdk` | JitPack |
| [Swift](sdk/swift/README.md) | `PachcaSDK` | SPM |
| [C#](sdk/csharp/README.md) | `Pachca.Sdk` | NuGet |

Все SDK следуют единому паттерну: `PachcaClient(token)` → `client.service.method(request)`.

Expand All @@ -121,14 +122,14 @@ SDK генерируются из `openapi.yaml` и публикуются ав

```bash
npx @pachca/generator --output ./generated --lang typescript
npx @pachca/generator --output ./generated --lang typescript,python,go
npx @pachca/generator --output ./generated --lang typescript,python,go,kotlin,swift,csharp
```

| Параметр | Описание |
|----------|----------|
| `--spec <path\|url>` | Путь или URL к OpenAPI 3.0 YAML (по умолчанию: `https://dev.pachca.com/openapi.yaml`) |
| `--output <dir>` | Директория для сгенерированного кода |
| `--lang <langs>` | Языки через запятую: `typescript`, `python`, `go`, `kotlin`, `swift` |
| `--lang <langs>` | Языки через запятую: `typescript`, `python`, `go`, `kotlin`, `swift`, `csharp` |
| `--examples` | Генерировать `examples.json` с примерами вызовов |

**Документация**: https://dev.pachca.com/guides/sdk/overview
Expand Down Expand Up @@ -192,15 +193,16 @@ bun turbo generate # TypeSpec → openapi.yaml + SDK
│ └── docs/ # Next.js 16 сайт документации (@pachca/docs)
├── packages/
│ ├── spec/ # TypeSpec спецификация + workflows.ts (@pachca/spec)
│ ├── generator/ # SDK код-генератор для 5 языков (@pachca/generator)
│ ├── generator/ # SDK код-генератор для 6 языков (@pachca/generator)
│ ├── openapi-parser/ # Парсер OpenAPI-спеки (@pachca/openapi-parser)
│ └── cli/ # CLI для работы с API (@pachca/cli)
├── sdk/ # SDK для 5 языков (генерируются @pachca/generator)
├── sdk/ # SDK для 6 языков (генерируются @pachca/generator)
│ ├── typescript/ # npm
│ ├── python/ # PyPI
│ ├── go/ # Go modules
│ ├── kotlin/ # JitPack
│ └── swift/ # SPM
│ ├── swift/ # SPM
│ └── csharp/ # NuGet
├── skills/ # Agent Skills (генерируются → apps/docs/public/.well-known/skills/)
├── .github/workflows/ # CI/CD (check, sdk, deploy, gitlab)
├── Package.swift # Корневой Swift Package (копируется из sdk/swift при CI)
Expand All @@ -221,7 +223,7 @@ typespec.tsp (packages/spec)
openapi.yaml ──────────────────────────┐
│ │
▼ ▼
apps/docs sdk/* (5 языков)
apps/docs sdk/* (6 языков)
│ │
│ generate-llms │ CI: generate + publish
│ next build ▼
Expand Down
4 changes: 3 additions & 1 deletion apps/docs/components/api/code-examples.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ interface CodeExamplesProps {
className?: string;
}

type Language = 'curl' | 'cli' | 'typescript' | 'python' | 'go' | 'kotlin' | 'swift';
type Language = 'curl' | 'cli' | 'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'csharp';

const STORAGE_KEY = 'pachca-docs-code-lang';

Expand All @@ -35,6 +35,7 @@ const languageLabels: Record<Language, string> = {
go: 'Go',
kotlin: 'Kotlin',
swift: 'Swift',
csharp: 'C#',
};

export function CodeExamples({
Expand Down Expand Up @@ -193,6 +194,7 @@ function getLanguageForHighlight(lang: Language): string {
go: 'go',
kotlin: 'kotlin',
swift: 'swift',
csharp: 'csharp',
};
return languageMap[lang];
}
8 changes: 4 additions & 4 deletions apps/docs/components/mdx/mdx-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ export async function ApiCards() {
* params — override query parameter values; only specified + required params are included (curl/cli only)
* responseMode — "full" (default): all fields with values; "minimal": null for nullable, [] for optional arrays
* lang — single language: no dropdown/header, renders as simple code block
* langs — filter languages in multi-language dropdown (e.g. ["typescript", "python", "go", "kotlin", "swift"])
* langs — filter languages in multi-language dropdown (e.g. ["typescript", "python", "go", "kotlin", "swift", "csharp"])
* operations — multiple operations in one block (single-language mode only)
* showInit — whether to include Client_Init (default: true)
*/
Expand All @@ -280,9 +280,9 @@ interface ApiCodeExampleProps {
show?: 'request' | 'response' | 'both';
params?: Record<string, unknown>;
responseMode?: 'full' | 'minimal';
lang?: 'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'curl' | 'cli';
langs?: Array<'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'curl' | 'cli'>;
defaultLang?: 'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'curl' | 'cli';
lang?: 'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'csharp' | 'curl' | 'cli';
langs?: Array<'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'csharp' | 'curl' | 'cli'>;
defaultLang?: 'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'csharp' | 'curl' | 'cli';
operations?: Array<{ id: string; comment?: string }>;
showInit?: boolean;
}
Expand Down
11 changes: 9 additions & 2 deletions apps/docs/components/mdx/sdk-commands.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { EndpointLink } from '@/components/api/endpoint-link';

const METHOD_ORDER: Record<string, number> = { POST: 0, GET: 1, PUT: 2, PATCH: 3, DELETE: 4 };

type SdkLanguage = 'typescript' | 'python' | 'go' | 'kotlin' | 'swift';
type SdkLanguage = 'typescript' | 'python' | 'go' | 'kotlin' | 'swift' | 'csharp';

/** Tag name → service property: "Group tags" → "groupTags" */
function tagToProperty(tag: string): string {
Expand All @@ -32,6 +32,11 @@ function camelToSnake(str: string): string {
.toLowerCase();
}

/** camelCase → PascalCase */
function camelToPascal(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}

function formatMethodCall(tag: string, operationId: string, lang: SdkLanguage): string {
const service = tagToProperty(tag);
const method = operationToMethod(operationId);
Expand All @@ -40,7 +45,9 @@ function formatMethodCall(tag: string, operationId: string, lang: SdkLanguage):
case 'python':
return `client.${camelToSnake(service)}.${camelToSnake(method)}()`;
case 'go':
return `client.${service.charAt(0).toUpperCase() + service.slice(1)}.${method.charAt(0).toUpperCase() + method.slice(1)}()`;
return `client.${camelToPascal(service)}.${camelToPascal(method)}()`;
case 'csharp':
return `client.${camelToPascal(service)}.${camelToPascal(method)}Async()`;
default:
return `client.${service}.${method}()`;
}
Expand Down
Loading
Loading