50 lines · 1.6 KB · TypeScript
RawDownload
import * as Schema from "effect/Schema"; class CatalogDependencyResolutionError extends Schema.TaggedErrorClass<CatalogDependencyResolutionError>()(  "CatalogDependencyResolutionError",  {    workspacePackage: Schema.String,    dependencyName: Schema.String,    catalogSpec: Schema.String,    catalogKey: Schema.String,  },) {  override get message(): string {    return `Unable to resolve '${this.catalogSpec}' for ${this.workspacePackage} dependency '${this.dependencyName}'. Expected key '${this.catalogKey}' in root workspace catalog.`;  }} /** * Resolve `catalog:` dependency specs using the workspace catalog. * * Pure function: returns a new record with every `catalog:…` value replaced by * the concrete version string found in `catalog`. Throws on missing entries. */export function resolveCatalogDependencies(  dependencies: Record<string, string>,  catalog: Record<string, string>,  workspacePackage: string,): Record<string, string> {  return Object.fromEntries(    Object.entries(dependencies).map(([name, spec]) => {      if (typeof spec !== "string" || !spec.startsWith("catalog:")) {        return [name, spec];      }       const catalogKey = spec.slice("catalog:".length).trim();      const lookupKey = catalogKey.length > 0 ? catalogKey : name;      const resolved = catalog[lookupKey];       if (typeof resolved !== "string" || resolved.length === 0) {        throw new CatalogDependencyResolutionError({          workspacePackage,          dependencyName: name,          catalogSpec: spec,          catalogKey: lookupKey,        });      }       return [name, resolved];    }),  );}