Compare commits

...

1 Commits

Author SHA1 Message Date
Kit Langton 792c85da4d fix(core): exclude deleted projects from listing 2026-07-31 11:21:05 -04:00
2 changed files with 23 additions and 8 deletions
+1 -1
View File
@@ -148,7 +148,7 @@ const layer = Layer.effect(
.orderBy(desc(ProjectTable.time_updated), asc(ProjectTable.id)) .orderBy(desc(ProjectTable.time_updated), asc(ProjectTable.id))
.all() .all()
.pipe(Effect.orDie) .pipe(Effect.orDie)
return rows.map(fromRow) return yield* Effect.filter(rows.map(fromRow), (project) => fs.existsSafe(project.canonical))
}) })
const directories = Effect.fn("Project.directories")(function* (input: DirectoriesInput) { const directories = Effect.fn("Project.directories")(function* (input: DirectoriesInput) {
+22 -7
View File
@@ -15,8 +15,16 @@ import { testEffect } from "./lib/effect"
const it = testEffect(Layer.merge(AppNodeBuilder.build(Project.node), AppNodeBuilder.build(Database.node))) const it = testEffect(Layer.merge(AppNodeBuilder.build(Project.node), AppNodeBuilder.build(Database.node)))
describe("Project.list", () => { describe("Project.list", () => {
it.effect("returns complete projects ordered by recent update", () => it.live("returns existing projects ordered by recent update", () =>
Effect.gen(function* () { Effect.gen(function* () {
const tmp = yield* Effect.acquireRelease(
Effect.promise(() => tmpdir()),
(tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()),
)
const older = abs(path.join(tmp.path, "older"))
const newer = abs(path.join(tmp.path, "newer"))
const deleted = abs(path.join(tmp.path, "deleted"))
yield* Effect.promise(() => Promise.all([fs.mkdir(older), fs.mkdir(newer)]))
const db = (yield* Database.Service).db const db = (yield* Database.Service).db
const project = yield* Project.Service const project = yield* Project.Service
yield* db yield* db
@@ -24,42 +32,49 @@ describe("Project.list", () => {
.values([ .values([
{ {
id: Project.ID.make("older"), id: Project.ID.make("older"),
worktree: abs("/older"), worktree: older,
vcs: "git", vcs: "git",
name: "Older", name: "Older",
icon_color: "#000000", icon_color: "#000000",
commands: { start: "bun dev" }, commands: { start: "bun dev" },
sandboxes: [abs("/older/sandbox")], sandboxes: [abs(path.join(older, "sandbox"))],
time_created: 1, time_created: 1,
time_updated: 1, time_updated: 1,
}, },
{ {
id: Project.ID.make("newer"), id: Project.ID.make("newer"),
worktree: abs("/newer"), worktree: newer,
sandboxes: [], sandboxes: [],
time_created: 2, time_created: 2,
time_updated: 2, time_updated: 2,
time_initialized: 3, time_initialized: 3,
}, },
{
id: Project.ID.make("deleted"),
worktree: deleted,
sandboxes: [],
time_created: 3,
time_updated: 3,
},
]) ])
.run() .run()
expect(yield* project.list()).toEqual([ expect(yield* project.list()).toEqual([
{ {
id: Project.ID.make("newer"), id: Project.ID.make("newer"),
canonical: abs("/newer"), canonical: newer,
time: { created: 2, updated: 2, initialized: 3 }, time: { created: 2, updated: 2, initialized: 3 },
sandboxes: [], sandboxes: [],
}, },
{ {
id: Project.ID.make("older"), id: Project.ID.make("older"),
canonical: abs("/older"), canonical: older,
vcs: "git", vcs: "git",
name: "Older", name: "Older",
icon: { color: "#000000" }, icon: { color: "#000000" },
commands: { start: "bun dev" }, commands: { start: "bun dev" },
time: { created: 1, updated: 1 }, time: { created: 1, updated: 1 },
sandboxes: [abs("/older/sandbox")], sandboxes: [abs(path.join(older, "sandbox"))],
}, },
]) ])
}), }),