refactor: rename services to scripts and extract reusable components

This commit is contained in:
Mohamed Boudra
2026-04-09 18:54:25 +07:00
parent 5cf806dc77
commit 397d454de0
48 changed files with 1356 additions and 983 deletions
+17 -17
View File
@@ -25,7 +25,7 @@ function createWorkspace(
status: input.status ?? "done",
activityAt: input.activityAt ?? null,
diffStat: input.diffStat ?? null,
services: input.services ?? [],
scripts: input.scripts ?? [],
};
}
@@ -34,10 +34,10 @@ afterEach(() => {
});
describe("normalizeWorkspaceDescriptor", () => {
it("normalizes workspace services and invalid activity timestamps", () => {
const services = [
it("normalizes workspace scripts and invalid activity timestamps", () => {
const scripts = [
{
serviceName: "web",
scriptName: "web",
hostname: "main.web.localhost",
port: 3000,
url: "http://main.web.localhost:6767",
@@ -57,13 +57,13 @@ describe("normalizeWorkspaceDescriptor", () => {
status: "running",
activityAt: "not-a-date",
diffStat: null,
services,
scripts,
});
expect(workspace.activityAt).toBeNull();
expect(workspace.services).toEqual([
expect(workspace.scripts).toEqual([
{
serviceName: "web",
scriptName: "web",
hostname: "main.web.localhost",
port: 3000,
url: "http://main.web.localhost:6767",
@@ -71,10 +71,10 @@ describe("normalizeWorkspaceDescriptor", () => {
health: "healthy",
},
]);
expect(workspace.services).not.toBe(services);
expect(workspace.scripts).not.toBe(scripts);
});
it("defaults missing services to an empty array", () => {
it("defaults missing scripts to an empty array", () => {
const payload = {
id: "1",
projectId: "1",
@@ -87,30 +87,30 @@ describe("normalizeWorkspaceDescriptor", () => {
status: "done",
activityAt: null,
diffStat: null,
services: [],
scripts: [],
} as WorkspaceDescriptorPayload;
const workspace = normalizeWorkspaceDescriptor(payload);
expect(workspace.services).toEqual([]);
expect(workspace.scripts).toEqual([]);
});
});
describe("mergeWorkspaces", () => {
it("preserves services on merged workspace entries", () => {
it("preserves scripts on merged workspace entries", () => {
const store = useSessionStore.getState();
store.initializeSession("test-server", null as unknown as DaemonClient);
store.setWorkspaces(
"test-server",
new Map([["/repo/main", createWorkspace({ id: "/repo/main", services: [] })]]),
new Map([["/repo/main", createWorkspace({ id: "/repo/main", scripts: [] })]]),
);
store.mergeWorkspaces("test-server", [
createWorkspace({
id: "/repo/main",
services: [
scripts: [
{
serviceName: "web",
scriptName: "web",
hostname: "main.web.localhost",
port: 3000,
url: "http://main.web.localhost:6767",
@@ -121,9 +121,9 @@ describe("mergeWorkspaces", () => {
}),
]);
expect(store.getSession("test-server")?.workspaces.get("/repo/main")?.services).toEqual([
expect(store.getSession("test-server")?.workspaces.get("/repo/main")?.scripts).toEqual([
{
serviceName: "web",
scriptName: "web",
hostname: "main.web.localhost",
port: 3000,
url: "http://main.web.localhost:6767",
+6 -3
View File
@@ -124,7 +124,7 @@ export interface WorkspaceDescriptor {
status: WorkspaceDescriptorPayload["status"];
activityAt: Date | null;
diffStat: { additions: number; deletions: number } | null;
services: WorkspaceDescriptorPayload["services"];
scripts: WorkspaceDescriptorPayload["scripts"];
}
export function normalizeWorkspaceDescriptor(
@@ -143,7 +143,7 @@ export function normalizeWorkspaceDescriptor(
status: payload.status,
activityAt: activityAt && !Number.isNaN(activityAt.getTime()) ? activityAt : null,
diffStat: payload.diffStat ?? null,
services: (payload.services ?? []).map((s) => ({ ...s })),
scripts: (payload.scripts ?? []).map((s) => ({ ...s })),
};
}
@@ -964,7 +964,10 @@ export const useSessionStore = create<SessionStore>()(
if (existing === workspace) {
continue;
}
next.set(workspace.id, workspace);
next.set(
workspace.id,
mergeWorkspaceSnapshotWithExisting({ incoming: workspace, existing }),
);
changed = true;
}
if (!changed) {