Skip to content

Commit 826fd33

Browse files
authored
refactor(config): migrate Server + Layout to Effect Schema (#23216)
1 parent 23a2d01 commit 826fd33

4 files changed

Lines changed: 41 additions & 25 deletions

File tree

packages/opencode/src/config/config.ts

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ import { Context, Duration, Effect, Exit, Fiber, Layer, Option } from "effect"
2525
import { EffectFlock } from "@opencode-ai/shared/util/effect-flock"
2626
import { InstanceRef } from "@/effect/instance-ref"
2727
import { ConfigAgent } from "./agent"
28+
import { ConfigCommand } from "./command"
29+
import { ConfigFormatter } from "./formatter"
30+
import { ConfigLayout } from "./layout"
31+
import { ConfigLSP } from "./lsp"
32+
import { ConfigManaged } from "./managed"
2833
import { ConfigMCP } from "./mcp"
2934
import { ConfigModelID } from "./model-id"
30-
import { ConfigPlugin } from "./plugin"
31-
import { ConfigManaged } from "./managed"
32-
import { ConfigCommand } from "./command"
3335
import { ConfigParse } from "./parse"
36+
import { ConfigPaths } from "./paths"
3437
import { ConfigPermission } from "./permission"
38+
import { ConfigPlugin } from "./plugin"
3539
import { ConfigProvider } from "./provider"
40+
import { ConfigServer } from "./server"
3641
import { ConfigSkills } from "./skills"
37-
import { ConfigPaths } from "./paths"
38-
import { ConfigFormatter } from "./formatter"
39-
import { ConfigLSP } from "./lsp"
4042
import { ConfigVariable } from "./variable"
4143
import { Npm } from "@/npm"
4244

@@ -73,23 +75,9 @@ async function resolveLoadedPlugins<T extends { plugin?: ConfigPlugin.Spec[] }>(
7375
return config
7476
}
7577

76-
export const Server = z
77-
.object({
78-
port: z.number().int().positive().optional().describe("Port to listen on"),
79-
hostname: z.string().optional().describe("Hostname to listen on"),
80-
mdns: z.boolean().optional().describe("Enable mDNS service discovery"),
81-
mdnsDomain: z.string().optional().describe("Custom domain name for mDNS service (default: opencode.local)"),
82-
cors: z.array(z.string()).optional().describe("Additional domains to allow for CORS"),
83-
})
84-
.strict()
85-
.meta({
86-
ref: "ServerConfig",
87-
})
88-
89-
export const Layout = z.enum(["auto", "stretch"]).meta({
90-
ref: "LayoutConfig",
91-
})
92-
export type Layout = z.infer<typeof Layout>
78+
export const Server = ConfigServer.Server.zod
79+
export const Layout = ConfigLayout.Layout.zod
80+
export type Layout = ConfigLayout.Layout
9381

9482
export const Info = z
9583
.object({
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Schema } from "effect"
2+
import { zod } from "@/util/effect-zod"
3+
import { withStatics } from "@/util/schema"
4+
5+
export const Layout = Schema.Literals(["auto", "stretch"])
6+
.annotate({ identifier: "LayoutConfig" })
7+
.pipe(withStatics((s) => ({ zod: zod(s) })))
8+
export type Layout = Schema.Schema.Type<typeof Layout>
9+
10+
export * as ConfigLayout from "./layout"

packages/opencode/src/config/provider.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import { Schema } from "effect"
22
import { zod } from "@/util/effect-zod"
33
import { withStatics } from "@/util/schema"
44

5-
// Positive integer: emits JSON Schema `type: integer, exclusiveMinimum: 0`
6-
// via the effect-zod walker's well-known refinement translation.
75
const PositiveInt = Schema.Number.check(Schema.isInt()).check(Schema.isGreaterThan(0))
86

97
export const Model = Schema.Struct({
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Schema } from "effect"
2+
import { zod } from "@/util/effect-zod"
3+
4+
export class Server extends Schema.Class<Server>("ServerConfig")({
5+
port: Schema.optional(Schema.Number.check(Schema.isInt()).check(Schema.isGreaterThan(0))).annotate({
6+
description: "Port to listen on",
7+
}),
8+
hostname: Schema.optional(Schema.String).annotate({ description: "Hostname to listen on" }),
9+
mdns: Schema.optional(Schema.Boolean).annotate({ description: "Enable mDNS service discovery" }),
10+
mdnsDomain: Schema.optional(Schema.String).annotate({
11+
description: "Custom domain name for mDNS service (default: opencode.local)",
12+
}),
13+
cors: Schema.optional(Schema.mutable(Schema.Array(Schema.String))).annotate({
14+
description: "Additional domains to allow for CORS",
15+
}),
16+
}) {
17+
static readonly zod = zod(this)
18+
}
19+
20+
export * as ConfigServer from "./server"

0 commit comments

Comments
 (0)