build.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { NodeFileSystem } from "@effect/platform-node"
  2. import { compile, emitEffectImported, emitEffectShape, emitPromise, write } from "@opencode-ai/httpapi-codegen"
  3. import {
  4. ClientApi,
  5. effectOmitEndpoints,
  6. groupNames,
  7. promiseOmitEndpoints,
  8. } from "@opencode-ai/protocol/client"
  9. import { Effect } from "effect"
  10. import { fileURLToPath } from "url"
  11. const promiseContract = compile(ClientApi, { groupNames, omitEndpoints: promiseOmitEndpoints })
  12. const effectContract = compile(ClientApi, { groupNames, omitEndpoints: effectOmitEndpoints })
  13. await Effect.runPromise(
  14. Effect.all(
  15. [
  16. write(
  17. emitPromise(promiseContract, {
  18. outputTypes: {
  19. "events.subscribe": {
  20. name: "OpenCodeEventEncoded",
  21. import: 'import type { OpenCodeEventEncoded } from "@opencode-ai/protocol/groups/event"',
  22. },
  23. },
  24. }),
  25. fileURLToPath(new URL("../src/promise/generated", import.meta.url)),
  26. ),
  27. write(
  28. emitEffectImported(effectContract, { module: "../../contract", api: "ClientApi" }),
  29. fileURLToPath(new URL("../src/effect/generated", import.meta.url)),
  30. ),
  31. write(
  32. emitEffectShape(effectContract, { module: "../../contract", api: "ClientApi" }),
  33. fileURLToPath(new URL("../src/effect/api", import.meta.url)),
  34. ),
  35. ],
  36. { concurrency: 3, discard: true },
  37. ).pipe(Effect.provide(NodeFileSystem.layer)),
  38. )