Files
NetMesh/domain/vaultGroupDeletion.ts
zhaolei 3c72efcb7f
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
[Init] Initial commit - NetMesh terminal manager
2026-09-13 18:24:01 +08:00

77 lines
2.3 KiB
TypeScript

import type { GroupConfig, Host, ManagedSource } from "./models";
const isPathAtOrBelow = (path: string, root: string): boolean => (
path === root || path.startsWith(`${root}/`)
);
export function minimizeVaultGroupPaths(paths: Iterable<string>): string[] {
const sorted = Array.from(new Set(
Array.from(paths, (path) => path.trim()).filter(Boolean),
)).sort((left, right) => left.length - right.length || left.localeCompare(right));
return sorted.filter((path, index) => (
!sorted.slice(0, index).some((root) => isPathAtOrBelow(path, root))
));
}
export function buildVaultGroupDeletion({
selectedPaths,
deleteHosts,
customGroups,
hosts,
groupConfigs,
managedSources,
}: {
selectedPaths: Iterable<string>;
deleteHosts: boolean;
customGroups: string[];
hosts: Host[];
groupConfigs: GroupConfig[];
managedSources: ManagedSource[];
}): {
selectedRoots: string[];
customGroups: string[];
hosts: Host[];
groupConfigs: GroupConfig[];
sourcesToRemove: ManagedSource[];
} {
const selectedRoots = minimizeVaultGroupPaths(selectedPaths);
const matchesSelection = (path: string) => (
selectedRoots.some((root) => isPathAtOrBelow(path, root))
);
const sourcesToRemove = managedSources.filter((source) => (
matchesSelection(source.groupName)
));
const removedSourceIds = new Set(sourcesToRemove.map((source) => source.id));
const nextHosts = hosts.flatMap((host) => {
const group = host.group || "";
const selectedRoot = selectedRoots.find((root) => isPathAtOrBelow(group, root));
if (!selectedRoot) return [host];
const belongsToRemovedSource = sourcesToRemove.some((source) => (
isPathAtOrBelow(group, source.groupName)
));
if (deleteHosts || belongsToRemovedSource) return [];
const retainedManagedSource = managedSources.find((source) => (
!removedSourceIds.has(source.id)
&& selectedRoot.startsWith(`${source.groupName}/`)
&& source.id === host.managedSourceId
));
return [{
...host,
group: "",
managedSourceId: retainedManagedSource ? host.managedSourceId : undefined,
}];
});
return {
selectedRoots,
customGroups: customGroups.filter((group) => !matchesSelection(group)),
hosts: nextHosts,
groupConfigs: groupConfigs.filter((config) => !matchesSelection(config.path)),
sourcesToRemove,
};
}