refactor(shared): dedupe requirements evaluation

This commit is contained in:
Peter Steinberger
2026-02-14 13:44:31 +00:00
parent 06bc9f368b
commit bc0160d0f2
4 changed files with 216 additions and 79 deletions

View File

@@ -0,0 +1,90 @@
export type Requirements = {
bins: string[];
anyBins: string[];
env: string[];
config: string[];
os: string[];
};
export type RequirementConfigCheck = {
path: string;
value: unknown;
satisfied: boolean;
};
export function resolveMissingBins(params: {
required: string[];
hasLocalBin: (bin: string) => boolean;
hasRemoteBin?: (bin: string) => boolean;
}): string[] {
const remote = params.hasRemoteBin;
return params.required.filter((bin) => {
if (params.hasLocalBin(bin)) {
return false;
}
if (remote?.(bin)) {
return false;
}
return true;
});
}
export function resolveMissingAnyBins(params: {
required: string[];
hasLocalBin: (bin: string) => boolean;
hasRemoteAnyBin?: (bins: string[]) => boolean;
}): string[] {
if (params.required.length === 0) {
return [];
}
if (params.required.some((bin) => params.hasLocalBin(bin))) {
return [];
}
if (params.hasRemoteAnyBin?.(params.required)) {
return [];
}
return params.required;
}
export function resolveMissingOs(params: {
required: string[];
localPlatform: string;
remotePlatforms?: string[];
}): string[] {
if (params.required.length === 0) {
return [];
}
if (params.required.includes(params.localPlatform)) {
return [];
}
if (params.remotePlatforms?.some((platform) => params.required.includes(platform))) {
return [];
}
return params.required;
}
export function resolveMissingEnv(params: {
required: string[];
isSatisfied: (envName: string) => boolean;
}): string[] {
const missing: string[] = [];
for (const envName of params.required) {
if (params.isSatisfied(envName)) {
continue;
}
missing.push(envName);
}
return missing;
}
export function buildConfigChecks(params: {
required: string[];
resolveValue: (pathStr: string) => unknown;
isSatisfied: (pathStr: string) => boolean;
}): RequirementConfigCheck[] {
return params.required.map((pathStr) => {
const value = params.resolveValue(pathStr);
const satisfied = params.isSatisfied(pathStr);
return { path: pathStr, value, satisfied };
});
}