build.ts 1.5 KB

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