[Init] Initial commit - NetMesh terminal manager
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
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
This commit is contained in:
76
domain/vaultGroupDeletion.ts
Normal file
76
domain/vaultGroupDeletion.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user