@wisemen/sdk-gen
v0.0.1
Published
Generate a typed SDK for a Wisemen API from its OpenAPI and AsyncAPI specs. The API marks what belongs in the SDK; the SDK package generates its client, types and channel constants with [hey-api](https://heyapi.dev).
Maintainers
Keywords
Readme
@wisemen/sdk-gen
Generate a typed SDK for a Wisemen API from its OpenAPI and AsyncAPI specs. The API marks what belongs in the SDK; the SDK package generates its client, types and channel constants with hey-api.
| Import | Used in | Contents |
|---|---|---|
| @wisemen/sdk-gen/markers | API | @SdkEndpoint(), SDK_CHANNEL_TAG |
| @wisemen/sdk-gen/config | SDK openapi.config.ts | defineSdkConfig() |
@nestjs/swagger (markers) and @hey-api/openapi-ts + yaml (config) are optional peer dependencies, so an API that only uses the markers doesn't need hey-api, and an SDK, which installs sdk-gen as a dev dependency, doesn't need @nestjs/swagger. @hey-api/openapi-ts is pinned to 0.99.x because its generated code changes between minors.
Mark endpoints and channels (API)
import { SdkEndpoint, SDK_CHANNEL_TAG } from '@wisemen/sdk-gen/markers'
@Get(':businessUuid')
@SdkEndpoint()
async viewBusinessDetail () {}
createChannel(BUSINESS_UPDATED_NATS_TOPIC, {
operations: {
sendBusinessUpdated: { action: 'send', tags: [SDK_CHANNEL_TAG], messages: [BusinessUpdatedIntegrationEvent] }
}
})A tagged channel must have exactly one message, and that message needs a single-value type enum. A channel with several event types is valid AsyncAPI, but generation fails on it because each generated channel constant holds one type.
Generate (SDK)
// openapi.config.ts
import { defineSdkConfig } from '@wisemen/sdk-gen/config'
export default defineSdkConfig({
openApiPath: '../../apps/api/dist/openapi/docs.json',
asyncApiPath: '../../apps/api/dist/src/modules/async-api/async-api.yaml', // optional
httpClient: 'axios', // or 'fetch'
containerName: 'WiseCrmSdk',
output: 'lib/generated' // default
})Run openapi-ts -f openapi.config.ts. Output in lib/generated/: sdk.gen.ts (the WiseCrmSdk class), types.gen.ts, the hey-api client, and channels.gen.ts with a { subject, type } constant per tagged channel.
Authenticate (SDK runtime)
createAccessTokenGetter lives in @wisemen/nestjs-zitadel, which the SDK installs as a dependency.
import { createAccessTokenGetter } from '@wisemen/nestjs-zitadel'
const getAccessToken = createAccessTokenGetter(
{ serviceUser: { issuer, serviceUserKey, projectId } } // or { getAccessToken }
)Attach it to the generated client in a small wrapper class. See skills/sdk-gen/SKILL.md for the full setup, both client variants and turbo wiring.
