Compare commits

...
Sign in to create a new pull request.

2 commits

4 changed files with 215 additions and 217 deletions

View file

@ -1,7 +1,6 @@
import z from "zod" import z from "zod"
export namespace ConfigKeybinds { export const Keybinds = z
export const Keybinds = z
.object({ .object({
leader: z.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"), leader: z.string().optional().default("ctrl+x").describe("Leader key for keybind combinations"),
app_exit: z.string().optional().default("ctrl+c,ctrl+d,<leader>q").describe("Exit the application"), app_exit: z.string().optional().default("ctrl+c,ctrl+d,<leader>q").describe("Exit the application"),
@ -161,4 +160,4 @@ export namespace ConfigKeybinds {
.meta({ .meta({
ref: "KeybindsConfig", ref: "KeybindsConfig",
}) })
} export * as ConfigKeybinds from "./keybinds"

View file

@ -4,23 +4,22 @@ import { pathToFileURL } from "url"
import { isPathPluginSpec, parsePluginSpecifier, resolvePathPluginTarget } from "@/plugin/shared" import { isPathPluginSpec, parsePluginSpecifier, resolvePathPluginTarget } from "@/plugin/shared"
import path from "path" import path from "path"
export namespace ConfigPlugin { const Options = z.record(z.string(), z.unknown())
const Options = z.record(z.string(), z.unknown()) export type Options = z.infer<typeof Options>
export type Options = z.infer<typeof Options>
export const Spec = z.union([z.string(), z.tuple([z.string(), Options])]) export const Spec = z.union([z.string(), z.tuple([z.string(), Options])])
export type Spec = z.infer<typeof Spec> export type Spec = z.infer<typeof Spec>
export type Scope = "global" | "local" export type Scope = "global" | "local"
export type Origin = { export type Origin = {
spec: Spec spec: Spec
source: string source: string
scope: Scope scope: Scope
} }
export async function load(dir: string) { export async function load(dir: string) {
const plugins: ConfigPlugin.Spec[] = [] const plugins: Spec[] = []
for (const item of await Glob.scan("{plugin,plugins}/*.{ts,js}", { for (const item of await Glob.scan("{plugin,plugins}/*.{ts,js}", {
cwd: dir, cwd: dir,
@ -31,17 +30,17 @@ export namespace ConfigPlugin {
plugins.push(pathToFileURL(item).href) plugins.push(pathToFileURL(item).href)
} }
return plugins return plugins
} }
export function pluginSpecifier(plugin: ConfigPlugin.Spec): string { export function pluginSpecifier(plugin: Spec): string {
return Array.isArray(plugin) ? plugin[0] : plugin return Array.isArray(plugin) ? plugin[0] : plugin
} }
export function pluginOptions(plugin: Spec): Options | undefined { export function pluginOptions(plugin: Spec): Options | undefined {
return Array.isArray(plugin) ? plugin[1] : undefined return Array.isArray(plugin) ? plugin[1] : undefined
} }
export async function resolvePluginSpec(plugin: Spec, configFilepath: string): Promise<Spec> { export async function resolvePluginSpec(plugin: Spec, configFilepath: string): Promise<Spec> {
const spec = pluginSpecifier(plugin) const spec = pluginSpecifier(plugin)
if (!isPathPluginSpec(spec)) return plugin if (!isPathPluginSpec(spec)) return plugin
@ -56,9 +55,9 @@ export namespace ConfigPlugin {
if (Array.isArray(plugin)) return [resolved, plugin[1]] if (Array.isArray(plugin)) return [resolved, plugin[1]]
return resolved return resolved
} }
export function deduplicatePluginOrigins(plugins: Origin[]): Origin[] { export function deduplicatePluginOrigins(plugins: Origin[]): Origin[] {
const seen = new Set<string>() const seen = new Set<string>()
const list: Origin[] = [] const list: Origin[] = []
@ -71,5 +70,5 @@ export namespace ConfigPlugin {
} }
return list.toReversed() return list.toReversed()
}
} }
export * as ConfigPlugin from "./plugin"

View file

@ -25,7 +25,7 @@ import { Global } from "../../src/global"
import { ProjectID } from "../../src/project/schema" import { ProjectID } from "../../src/project/schema"
import { Filesystem } from "../../src/util" import { Filesystem } from "../../src/util"
import * as Network from "../../src/util/network" import * as Network from "../../src/util/network"
import { ConfigPlugin } from "@/config/plugin" import { ConfigPlugin } from "../../src/config/plugin"
import { Npm } from "@opencode-ai/shared/npm" import { Npm } from "@opencode-ai/shared/npm"
const emptyAccount = Layer.mock(Account.Service)({ const emptyAccount = Layer.mock(Account.Service)({

View file

@ -10,7 +10,7 @@ import { Filesystem } from "../../src/util"
import { AppRuntime } from "../../src/effect/app-runtime" import { AppRuntime } from "../../src/effect/app-runtime"
import { Effect, Layer } from "effect" import { Effect, Layer } from "effect"
import { CurrentWorkingDirectory } from "@/cli/cmd/tui/config/cwd" import { CurrentWorkingDirectory } from "@/cli/cmd/tui/config/cwd"
import { ConfigPlugin } from "@/config/plugin" import { ConfigPlugin } from "../../src/config/plugin"
const wintest = process.platform === "win32" ? test : test.skip const wintest = process.platform === "win32" ? test : test.skip
const clear = (wait = false) => AppRuntime.runPromise(Config.Service.use((svc) => svc.invalidate(wait))) const clear = (wait = false) => AppRuntime.runPromise(Config.Service.use((svc) => svc.invalidate(wait)))