refactor(core): consolidate filesystem services (#30447)

This commit is contained in:
Dax
2026-06-02 16:09:26 -04:00
committed by GitHub
parent b93963e462
commit 604a5f781f
153 changed files with 2553 additions and 4312 deletions

View File

@@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test"
import path from "path"
import { pathToFileURL } from "url"
import { Effect, Layer } from "effect"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { FSUtil } from "@opencode-ai/core/fs-util"
import { provideInstance, TestInstance, tmpdirScoped } from "../fixture/fixture"
import { ProviderAuth } from "@/provider/auth"
@@ -15,7 +15,7 @@ import { testEffect } from "../lib/effect"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { ProviderV2 } from "@opencode-ai/core/provider"
const it = testEffect(Layer.mergeAll(CrossSpawnSpawner.defaultLayer, AppFileSystem.defaultLayer))
const it = testEffect(Layer.mergeAll(CrossSpawnSpawner.defaultLayer, FSUtil.defaultLayer))
function layer(directory: string, plugins: string[]) {
return ProviderAuth.layer.pipe(
@@ -49,7 +49,7 @@ describe("plugin.auth-override", () => {
() =>
Effect.gen(function* () {
const tmp = yield* TestInstance
const fs = yield* AppFileSystem.Service
const fs = yield* FSUtil.Service
const pluginDir = path.join(tmp.directory, ".opencode", "plugin")
yield* fs.writeWithDirs(

View File

@@ -4,7 +4,7 @@ import fs from "fs/promises"
import path from "path"
import { pathToFileURL } from "url"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { FSUtil } from "@opencode-ai/core/fs-util"
import { disposeAllInstances, provideInstance, testInstanceStoreLayer, tmpdirScoped } from "../fixture/fixture"
import { testEffect } from "../lib/effect"
@@ -20,9 +20,7 @@ afterEach(async () => {
await disposeAllInstances()
})
const it = testEffect(
Layer.mergeAll(CrossSpawnSpawner.defaultLayer, AppFileSystem.defaultLayer, testInstanceStoreLayer),
)
const it = testEffect(Layer.mergeAll(CrossSpawnSpawner.defaultLayer, FSUtil.defaultLayer, testInstanceStoreLayer))
function withTmp<T, A, E, R>(
init: (dir: string) => Promise<T>,
@@ -839,7 +837,7 @@ describe("plugin.loader.shared", () => {
Effect.gen(function* () {
yield* load(tmp.path)
expect(
(yield* (yield* AppFileSystem.Service).readJson(tmp.extra.mark)) as { source: string; enabled: boolean },
(yield* (yield* FSUtil.Service).readJson(tmp.extra.mark)) as { source: string; enabled: boolean },
).toEqual({
source: "tuple",
enabled: true,
@@ -962,7 +960,7 @@ export default {
(tmp) =>
Effect.gen(function* () {
const file = path.join(tmp.extra.mod, "package.json")
const fsys = yield* AppFileSystem.Service
const fsys = yield* FSUtil.Service
const json = (yield* fsys.readJson(file)) as Record<string, unknown>
const list = readPackageThemes("acme-plugin", {
dir: tmp.extra.mod,
@@ -971,8 +969,8 @@ export default {
})
expect(list).toEqual([
AppFileSystem.resolve(path.join(tmp.extra.mod, "themes", "one.json")),
AppFileSystem.resolve(path.join(tmp.extra.mod, "themes", "two.json")),
FSUtil.resolve(path.join(tmp.extra.mod, "themes", "one.json")),
FSUtil.resolve(path.join(tmp.extra.mod, "themes", "two.json")),
])
}),
),
@@ -1036,7 +1034,7 @@ export default {
{
spec: "acme-plugin@1.0.0",
target: tmp.extra.mod,
themes: [AppFileSystem.resolve(path.join(tmp.extra.mod, "themes", "night.json"))],
themes: [FSUtil.resolve(path.join(tmp.extra.mod, "themes", "night.json"))],
},
])
expect(missing).toHaveLength(0)
@@ -1099,7 +1097,7 @@ export default {
expect(loaded).toEqual([
{
spec: "acme-plugin@1.0.0",
themes: [AppFileSystem.resolve(path.join(tmp.extra.mod, "themes", "night.json"))],
themes: [FSUtil.resolve(path.join(tmp.extra.mod, "themes", "night.json"))],
},
])
} finally {
@@ -1120,7 +1118,7 @@ export default {
},
(tmp) =>
Effect.gen(function* () {
const fsys = yield* AppFileSystem.Service
const fsys = yield* FSUtil.Service
const json = (yield* fsys.readJson(tmp.extra.file)) as Record<string, unknown>
expect(() =>
readPackageThemes("acme", {

View File

@@ -2,7 +2,7 @@ import { describe, expect } from "bun:test"
import { Effect, Layer } from "effect"
import { FetchHttpClient } from "effect/unstable/http"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { FSUtil } from "@opencode-ai/core/fs-util"
import { EffectFlock } from "@opencode-ai/core/util/effect-flock"
import path from "path"
import { pathToFileURL } from "url"
@@ -21,7 +21,7 @@ import { ProviderV2 } from "@opencode-ai/core/provider"
const configLayer = Config.layer.pipe(
Layer.provide(EffectFlock.defaultLayer),
Layer.provide(AppFileSystem.defaultLayer),
Layer.provide(FSUtil.defaultLayer),
Layer.provide(Env.defaultLayer),
Layer.provide(AuthTest.empty),
Layer.provide(AccountTest.empty),

View File

@@ -3,7 +3,7 @@ import { Effect, Layer } from "effect"
import { FetchHttpClient } from "effect/unstable/http"
import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
import { Database } from "@opencode-ai/core/database/database"
import { AppFileSystem } from "@opencode-ai/core/filesystem"
import { FSUtil } from "@opencode-ai/core/fs-util"
import { EffectFlock } from "@opencode-ai/core/util/effect-flock"
import path from "path"
import { pathToFileURL } from "url"
@@ -29,7 +29,7 @@ import { NpmTest } from "../fake/npm"
const configLayer = Config.layer.pipe(
Layer.provide(EffectFlock.defaultLayer),
Layer.provide(AppFileSystem.defaultLayer),
Layer.provide(FSUtil.defaultLayer),
Layer.provide(Env.defaultLayer),
Layer.provide(AuthTest.empty),
Layer.provide(AccountTest.empty),
@@ -51,7 +51,7 @@ const workspaceLayer = Workspace.layer.pipe(
Layer.provide(FetchHttpClient.layer),
Layer.provide(Database.defaultLayer),
Layer.provide(EventV2Bridge.defaultLayer),
Layer.provide(AppFileSystem.defaultLayer),
Layer.provide(FSUtil.defaultLayer),
Layer.provide(InstanceStore.defaultLayer.pipe(Layer.provide(noopBootstrapLayer))),
Layer.provide(RuntimeFlags.layer({ experimentalWorkspaces: true })),
)