summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKit Langton <[email protected]>2026-04-17 16:34:47 -0400
committerGitHub <[email protected]>2026-04-17 20:34:47 +0000
commit650a13a6908e23c30e07329f9f3ec816d7a6f2a7 (patch)
tree77024b61124c1d71412b9e66948b6d72f96f20b0
parent54435325b6adf292d720885622f1282eaed98c92 (diff)
downloadopencode-650a13a6908e23c30e07329f9f3ec816d7a6f2a7.tar.gz
opencode-650a13a6908e23c30e07329f9f3ec816d7a6f2a7.zip
refactor(config): migrate lsp schemas to Effect Schema (#23167)
-rw-r--r--packages/opencode/src/config/config.ts2
-rw-r--r--packages/opencode/src/config/lsp.ts58
2 files changed, 33 insertions, 27 deletions
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 258500d7b..039b0598d 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -189,7 +189,7 @@ export const Info = z
.optional()
.describe("MCP (Model Context Protocol) server configurations"),
formatter: ConfigFormatter.Info.optional(),
- lsp: ConfigLSP.Info.optional(),
+ lsp: ConfigLSP.Info.zod.optional(),
instructions: z.array(z.string()).optional().describe("Additional instruction files or patterns to include"),
layout: Layout.optional().describe("@deprecated Always uses stretch layout."),
permission: ConfigPermission.Info.optional(),
diff --git a/packages/opencode/src/config/lsp.ts b/packages/opencode/src/config/lsp.ts
index 5530a5be5..94a6d4bc5 100644
--- a/packages/opencode/src/config/lsp.ts
+++ b/packages/opencode/src/config/lsp.ts
@@ -1,37 +1,43 @@
export * as ConfigLSP from "./lsp"
-import z from "zod"
+import { Schema } from "effect"
+import { zod } from "@/util/effect-zod"
+import { withStatics } from "@/util/schema"
import * as LSPServer from "../lsp/server"
-export const Disabled = z.object({
- disabled: z.literal(true),
-})
+export const Disabled = Schema.Struct({
+ disabled: Schema.Literal(true),
+}).pipe(withStatics((s) => ({ zod: zod(s) })))
-export const Entry = z.union([
+export const Entry = Schema.Union([
Disabled,
- z.object({
- command: z.array(z.string()),
- extensions: z.array(z.string()).optional(),
- disabled: z.boolean().optional(),
- env: z.record(z.string(), z.string()).optional(),
- initialization: z.record(z.string(), z.any()).optional(),
+ Schema.Struct({
+ command: Schema.mutable(Schema.Array(Schema.String)),
+ extensions: Schema.optional(Schema.mutable(Schema.Array(Schema.String))),
+ disabled: Schema.optional(Schema.Boolean),
+ env: Schema.optional(Schema.Record(Schema.String, Schema.String)),
+ initialization: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),
}),
-])
+]).pipe(withStatics((s) => ({ zod: zod(s) })))
-export const Info = z.union([z.boolean(), z.record(z.string(), Entry)]).refine(
- (data) => {
- if (typeof data === "boolean") return true
- const serverIds = new Set(Object.values(LSPServer).map((server) => server.id))
+export const Info = Schema.Union([Schema.Boolean, Schema.Record(Schema.String, Entry)]).pipe(
+ withStatics((s) => ({
+ zod: zod(s).refine(
+ (data) => {
+ if (typeof data === "boolean") return true
+ const serverIds = new Set(Object.values(LSPServer).map((server) => server.id))
- return Object.entries(data).every(([id, config]) => {
- if (config.disabled) return true
- if (serverIds.has(id)) return true
- return Boolean(config.extensions)
- })
- },
- {
- error: "For custom LSP servers, 'extensions' array is required.",
- },
+ return Object.entries(data).every(([id, config]) => {
+ if (config.disabled) return true
+ if (serverIds.has(id)) return true
+ return Boolean(config.extensions)
+ })
+ },
+ {
+ error: "For custom LSP servers, 'extensions' array is required.",
+ },
+ ),
+ })),
)
-export type Info = z.infer<typeof Info>
+export type Info = Schema.Schema.Type<typeof Info>