@ts-for-gir/lib
Version:
Typescript .d.ts generator from GIR for gjs
82 lines (69 loc) • 3.02 kB
text/typescript
import type { DependencyManager } from "../dependency-manager.ts";
import type { Dependency } from "../types/index.ts";
import { find } from "../utils/objects.ts";
/**
* Handles resolution and validation of GIR module dependencies
*/
export class DependencyResolver {
private readonly dependencyManager: DependencyManager;
constructor(dependencyManager: DependencyManager) {
this.dependencyManager = dependencyManager;
}
/**
* Resolves transitive dependencies and adds missing required dependencies
*/
async resolveTransitiveDependencies(
packageName: string,
transitiveDependencies: Dependency[],
): Promise<Dependency[]> {
// Always pull in GObject-2.0, as we may need it for e.g. GObject-2.0.type
if (packageName !== "GObject-2.0") {
this.ensureGObjectDependency(transitiveDependencies);
}
// Add package-specific missing dependencies
this.addPackageSpecificDependencies(packageName, transitiveDependencies);
return transitiveDependencies;
}
private ensureGObjectDependency(transitiveDependencies: Dependency[]): void {
if (!this.hasDependency(transitiveDependencies, "GObject-2.0")) {
transitiveDependencies.push(this.getDependency("GObject", "2.0"));
}
}
private addPackageSpecificDependencies(packageName: string, transitiveDependencies: Dependency[]): void {
const dependencyRules = this.getDependencyRules();
const rule = dependencyRules[packageName];
if (rule) {
rule.forEach(({ namespace, version }) => {
const requiredPackage = `${namespace}-${version}`;
if (!this.hasDependency(transitiveDependencies, requiredPackage)) {
transitiveDependencies.push(this.getDependency(namespace, version));
}
});
}
}
private getDependencyRules(): Record<string, Array<{ namespace: string; version: string; required: string }>> {
return {
"UnityExtras-7.0": [{ namespace: "Unity", version: "7.0", required: "Unity-7.0" }],
"UnityExtras-6.0": [{ namespace: "Unity", version: "6.0", required: "Unity-6.0" }],
"GTop-2.0": [{ namespace: "GLib", version: "2.0", required: "GLib-2.0" }],
"GioUnix-2.0": [
{ namespace: "Gio", version: "2.0", required: "Gio-2.0" },
{ namespace: "GLib", version: "2.0", required: "GLib-2.0" },
],
};
}
private hasDependency(dependencies: Dependency[], packageName: string): boolean {
return find(dependencies, (x) => x.packageName === packageName) !== undefined;
}
private getDependency(namespace: string, version: string): Dependency {
// This will be resolved asynchronously - for now, we'll use a placeholder
// In the actual implementation, this should call this.dependencyManager.get(namespace, version)
throw new Error(`Dependency resolution for ${namespace}-${version} needs to be implemented asynchronously`);
}
/**
* Asynchronously gets a dependency - this method should be used instead of getDependency
*/
async getDependencyAsync(namespace: string, version: string): Promise<Dependency> {
return await this.dependencyManager.get(namespace, version);
}
}