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
77 lines
2.3 KiB
TypeScript
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,
|
|
};
|
|
}
|