{"_id":"@ahmedrowaihi/asyncapi-typescript","_rev":"3-95a3d6b58287362a89382417a1692e42","name":"@ahmedrowaihi/asyncapi-typescript","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@ahmedrowaihi/asyncapi-typescript","version":"1.0.0","keywords":["asyncapi","typescript","codegen","events","amqp","rabbitmq"],"author":{"name":"Ahmed Rowaihi","email":"ahmedrowaihi@gmail.com"},"license":"MIT","_id":"@ahmedrowaihi/asyncapi-typescript@1.0.0","maintainers":[{"name":"ahmedrowaihi","email":"ahmedrowaihi1@gmail.com"}],"homepage":"https://github.com/ahmedrowaihi/contract-kit/tree/main/packages/asyncapi/typescript","bugs":{"url":"https://github.com/ahmedrowaihi/contract-kit/issues"},"dist":{"shasum":"8aeabfab15cc0d0e2ba3ed2f71283720e1a5364a","tarball":"https://registry.npmjs.org/@ahmedrowaihi/asyncapi-typescript/-/asyncapi-typescript-1.0.0.tgz","fileCount":149,"integrity":"sha512-9Vq8es0BwLvMvqM3YpUNwQoPFbRaIqoB/CWvwAD1FyhNnQRBzh8vsaO/kTxC+i98zV7xZ8lV2xF9fQWfSK4R3Q==","signatures":[{"sig":"MEUCIHU9czl6Jopxeg1J/HldvDIau0SyNwIIY8Bg7L4NLN8KAiEAmV+ov/TvxDMiUTcGmVSeN7AYxKYdKhZ7t2HYV3OK5Fc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmedrowaihi%2fasyncapi-typescript@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":119090},"main":"./dist/index.js","type":"module","_from":"file:ahmedrowaihi-asyncapi-typescript-1.0.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json && node scripts/copy-bundles.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ahmedrowaihi","email":"ahmedrowaihi1@gmail.com"},"_resolved":"/tmp/d3395eee8778d2b106140c58e408727d/ahmedrowaihi-asyncapi-typescript-1.0.0.tgz","_integrity":"sha512-9Vq8es0BwLvMvqM3YpUNwQoPFbRaIqoB/CWvwAD1FyhNnQRBzh8vsaO/kTxC+i98zV7xZ8lV2xF9fQWfSK4R3Q==","repository":{"url":"git+https://github.com/ahmedrowaihi/contract-kit.git","type":"git","directory":"packages/asyncapi/typescript"},"_npmVersion":"10.8.2","description":"AsyncAPI 3.0 → TypeScript generator. Plugin-compose architecture: a small core orchestrates parser → IR → registered plugins, each emitting one slice of generated code (types, Events const, dispatch helpers, AMQP helpers, framework adapters). Parser via @","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.0","amqplib":"^0.10.4","typescript":"^5.9.3","@types/node":"^22","@types/amqplib":"^0.10.5","testcontainers":"^11.14.0","@asyncapi/parser":"^3.6.0","@asyncapi/modelina":"^5.0.0","@hey-api/codegen-core":"^0.8.1","@ahmedrowaihi/tsconfig":"0.0.0","@testcontainers/rabbitmq":"^11.14.0","@ahmedrowaihi/codegen-core":"0.2.1","@ahmedrowaihi/asyncapi-core":"1.0.0"},"peerDependencies":{"amqplib":">=0.10.0","typescript":">=5.0.0","@asyncapi/parser":">=3.0.0","@asyncapi/modelina":">=5.0.0","@hey-api/codegen-core":">=0.8.0","@ahmedrowaihi/codegen-core":">=0.2.1","@ahmedrowaihi/asyncapi-core":">=1.0.0"},"peerDependenciesMeta":{"amqplib":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/asyncapi-typescript_1.0.0_1777638932579_0.518743156936236","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Moved to @ir-kit/asyncapi-typescript. See https://github.com/ir-kit/ir-kit for migration."},"1.1.0":{"name":"@ahmedrowaihi/asyncapi-typescript","version":"1.1.0","keywords":["asyncapi","typescript","codegen","events","amqp","rabbitmq"],"author":{"name":"Ahmed Rowaihi","email":"ahmedrowaihi@gmail.com"},"license":"MIT","_id":"@ahmedrowaihi/asyncapi-typescript@1.1.0","maintainers":[{"name":"ahmedrowaihi","email":"ahmedrowaihi1@gmail.com"}],"homepage":"https://github.com/ahmedrowaihi/contract-kit/tree/main/packages/asyncapi/typescript","bugs":{"url":"https://github.com/ahmedrowaihi/contract-kit/issues"},"dist":{"shasum":"23e73c676a31e2d0b8c089a601a240468350b097","tarball":"https://registry.npmjs.org/@ahmedrowaihi/asyncapi-typescript/-/asyncapi-typescript-1.1.0.tgz","fileCount":145,"integrity":"sha512-s9o8XThm5ofnN+fz89miUZ/yPH2qo303K1lEg2TEflhf3I1vrw6uL63ehXPnKE1w5AgZX9IAbFkP+hSd2+k+UA==","signatures":[{"sig":"MEYCIQDB6pWm+3tcN9yTW4PTK5UlC/eNZBMgGMFxD2BjhomrsgIhANLyD/t1XJAw4df0LDouIJIwlMCY26HfKeEZdWMx9OGg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ahmedrowaihi%2fasyncapi-typescript@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":123351},"main":"./dist/index.js","type":"module","_from":"file:ahmedrowaihi-asyncapi-typescript-1.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20.19.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json && node scripts/copy-bundles.mjs","typecheck":"tsc --noEmit"},"_npmUser":{"name":"ahmedrowaihi","email":"ahmedrowaihi1@gmail.com"},"_resolved":"/tmp/99a3b80de7e3f5a9acdaa6b1cc838f3b/ahmedrowaihi-asyncapi-typescript-1.1.0.tgz","_integrity":"sha512-s9o8XThm5ofnN+fz89miUZ/yPH2qo303K1lEg2TEflhf3I1vrw6uL63ehXPnKE1w5AgZX9IAbFkP+hSd2+k+UA==","repository":{"url":"git+https://github.com/ahmedrowaihi/contract-kit.git","type":"git","directory":"packages/asyncapi/typescript"},"_npmVersion":"10.8.2","description":"AsyncAPI 3.0 → TypeScript generator. Plugin-compose architecture: a small core orchestrates parser → IR → registered plugins, each emitting one slice of generated code (types, Events const, dispatch helpers, AMQP helpers, framework adapters). Parser via @","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.0","amqplib":"^0.10.4","typescript":"^5.9.3","@types/node":"^22","@types/amqplib":"^0.10.5","testcontainers":"^11.14.0","@asyncapi/parser":"^3.6.0","@asyncapi/modelina":"^5.0.0","@hey-api/codegen-core":"^0.8.1","@ahmedrowaihi/tsconfig":"0.0.0","@testcontainers/rabbitmq":"^11.14.0","@ahmedrowaihi/codegen-core":"0.2.1","@ahmedrowaihi/asyncapi-core":"1.0.0"},"peerDependencies":{"amqplib":">=0.10.0","typescript":">=5.0.0","@asyncapi/parser":">=3.0.0","@asyncapi/modelina":">=5.0.0","@hey-api/codegen-core":">=0.8.0","@ahmedrowaihi/codegen-core":">=0.2.1","@ahmedrowaihi/asyncapi-core":">=1.0.0"},"peerDependenciesMeta":{"amqplib":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/asyncapi-typescript_1.1.0_1777640443210_0.016320571013894503","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Moved to @ir-kit/asyncapi-typescript. See https://github.com/ir-kit/ir-kit for migration."}},"time":{"created":"2026-05-01T12:35:32.481Z","modified":"2026-05-21T09:19:16.320Z","1.0.0":"2026-05-01T12:35:32.714Z","1.1.0":"2026-05-01T13:00:43.375Z"},"bugs":{"url":"https://github.com/ahmedrowaihi/contract-kit/issues"},"author":{"name":"Ahmed Rowaihi","email":"ahmedrowaihi@gmail.com"},"license":"MIT","homepage":"https://github.com/ahmedrowaihi/contract-kit/tree/main/packages/asyncapi/typescript","keywords":["asyncapi","typescript","codegen","events","amqp","rabbitmq"],"repository":{"url":"git+https://github.com/ahmedrowaihi/contract-kit.git","type":"git","directory":"packages/asyncapi/typescript"},"description":"AsyncAPI 3.0 → TypeScript generator. Plugin-compose architecture: a small core orchestrates parser → IR → registered plugins, each emitting one slice of generated code (types, Events const, dispatch helpers, AMQP helpers, framework adapters). Parser via @","maintainers":[{"name":"ahmedrowaihi","email":"ahmedrowaihi1@gmail.com"}],"readme":"# @ahmedrowaihi/asyncapi-typescript\n\nAsyncAPI 3.0 → TypeScript generator. Plugin-compose architecture.\n\nEach plugin emits one slice of generated code (types, Events const, dispatch helpers, AMQP helpers, framework adapters). Caller picks which plugins to enable; orchestrator topologically sorts by `dependsOn` and writes via `@hey-api/codegen-core`'s `Project` pipeline.\n\n## Install\n\n```sh\npnpm add -D @ahmedrowaihi/asyncapi-typescript\n```\n\nPeer deps (most are dev-only at consumer side):\n\n- `@asyncapi/parser` `>=3.0.0`\n- `@asyncapi/modelina` `>=5.0.0`\n- `@hey-api/codegen-core` `>=0.8.0`\n- `@ahmedrowaihi/asyncapi-core`, `@ahmedrowaihi/asyncapi-core`, `@ahmedrowaihi/codegen-core`\n- `typescript` `>=5.0.0`\n- `amqplib` `>=0.10.0` *(optional — only if you enable the `amqplib` plugin)*\n\n## Usage\n\n```ts\nimport {\n  amqplib,\n  dispatch,\n  eventMap,\n  events,\n  generate,\n  indexBarrel,\n  typescript,\n} from \"@ahmedrowaihi/asyncapi-typescript\";\n\nawait generate({\n  input: \"./asyncapi.yaml\",\n  output: \"./generated\",\n  plugins: [\n    typescript(),\n    events(),\n    eventMap(),\n    dispatch(),\n    amqplib(),\n    indexBarrel(),\n  ],\n});\n```\n\nFor a full RabbitMQ run (producer + consumer end-to-end), see `examples/asyncapi-events-playground/` in the contract-kit monorepo.\n\n## Built-in plugins\n\n| Plugin | File(s) emitted | Description |\n|---|---|---|\n| `typescript()` | `types.gen.ts` | TS interfaces from message payload schemas (via `@asyncapi/modelina`). Names taken from spec message ids. |\n| `events()` | `events.gen.ts` | `Events` const with `{type, routingKey, exchange, exchangeType, contentType}` per channel/operation, plus an `EventName` type alias |\n| `eventMap()` | `event-map.gen.ts` | `EventMap` keyed by event-type literal → message interface, `AnyMessage` union, `isMessageOfType` discriminator |\n| `dispatch()` | `dispatch.gen.ts` + `handlers.gen.ts` | Generic `Registry` runtime (with `.on(...)`, `.dispatch`, `.toCallback(...)`, `.bindings`) + spec-bound `handlers()` factory |\n| `amqplib()` | `amqp.gen.ts` | `assertExchanges` / `bindAndConsume` / `publish` helpers — pure passthroughs to `amqplib` (no hidden defaults) |\n| `indexBarrel()` | `index.gen.ts` | Barrel re-export of every other enabled plugin's surface |\n\nPlugins compose freely. Each plugin's `dependsOn` ensures correct ordering even if the user lists them out of order.\n\n## Authoring custom plugins\n\n```ts\nimport { definePluginConfig } from \"@ahmedrowaihi/asyncapi-typescript\";\n\nexport const myPlugin = definePluginConfig<\n  \"my-plugin\",\n  { fileName?: string },\n  { fileName: string },\n  unknown\n>({\n  name: \"my-plugin\",\n  defaultConfig: { fileName: \"my.gen.ts\" },\n  dependsOn: [\"typescript\"], // run after the typescript plugin\n  handler(plugin) {\n    for (const ev of plugin.forEach(\"message\")) {\n      if (ev.type !== \"message\") continue;\n      // ...inspect ev.message...\n    }\n    plugin.emit({\n      path: plugin.config.fileName,\n      content: \"// my custom code\\n\",\n    });\n    // or, for AST emission:\n    // plugin.emitTs(\"my.gen.ts\", [ts.factory.createXxx(...), ...], { header: \"// ...\" });\n  },\n});\n```\n\nThe `PluginInstance` exposes:\n\n- `plugin.config` — typed resolved config\n- `plugin.api` — typed plugin api (other plugins fetch via `plugin.getApi(name)`)\n- `plugin.document` — the parsed `AsyncAPIDocumentInterface`\n- `plugin.files` — files emitted so far (for plugins like `index-barrel` that inspect prior output)\n- `plugin.emit({path, content})` — emit a file as raw text\n- `plugin.emitTs(path, statements, {header?})` — emit a file as `ts.Statement[]` (rendered via TypeScript's printer)\n- `plugin.getApi<T>(name)` — fetch another plugin's exposed api\n- `plugin.forEach('message' | 'channel' | 'operation', ...)` — iterate spec entities\n\n## How the pipeline works\n\n```\nasyncapi.yaml\n  └─ @asyncapi/parser → AsyncAPIDocumentInterface\n      └─ orchestrator (topological sort by dependsOn)\n          └─ for each plugin:\n                handler(PluginInstance)\n                  ├─ plugin.emit(rawText)   → RawTextNode → Project.files\n                  └─ plugin.emitTs(stmts)   → TsStatementNode → Project.files\n          └─ project.plan() + project.render()\n              ├─ TsStatementRenderer → ts.createPrinter\n              └─ RawTextRenderer → concat\n          └─ write outputs to disk\n```\n\n## Related\n\n- [`actions/asyncapi-regen`](../../actions/asyncapi-regen) — GitHub Action wrapping this generator\n- [`@ahmedrowaihi/openapi-typescript`](../openapi-typescript) — sister generator for OpenAPI 3.x specs\n- [`fixtures/user-events.yaml`](../../fixtures/user-events.yaml) — minimal AsyncAPI 3.0 spec used by tests\n","readmeFilename":"README.md"}