authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-06-20 11:01:36-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-06-20 11:01:36-07:00
log40d14647db0adfcb66b1bfe4482868c425c3c5d8
tree97a87e31ee42d127ebe385cbd61e47890a58a43d
parentcc69aef4dd140703762282ea207e0bcae7f9d9a1
signature Signed by PGP key B5690EEEBB952194

[codex] Structure catalog dependency resolution failures (#3298)

Co-authored-by: codex <codex@users.noreply.github.com>

2 files changed, 43 insertions(+), 4 deletions(-)

scripts/lib/resolve-catalog.test.ts created+20
......@@ -0,0 +1,20 @@
1import { assert, it } from "@effect/vitest";
2
3import { CatalogDependencyResolutionError, resolveCatalogDependencies } from "./resolve-catalog.ts";
4
5it("reports unresolved catalog dependencies with lookup context", () => {
6 try {
7 resolveCatalogDependencies({ effect: "catalog:runtime" }, {}, "apps/server");
8 assert.fail("Expected catalog resolution to fail.");
9 } catch (error) {
10 assert.instanceOf(error, CatalogDependencyResolutionError);
11 assert.equal(error.workspacePackage, "apps/server");
12 assert.equal(error.dependencyName, "effect");
13 assert.equal(error.catalogSpec, "catalog:runtime");
14 assert.equal(error.catalogKey, "runtime");
15 assert.equal(
16 error.message,
17 "Unable to resolve 'catalog:runtime' for apps/server dependency 'effect'. Expected key 'runtime' in root workspace catalog.",
18 );
19 }
20});
scripts/lib/resolve-catalog.ts+23-4
......@@ -1,3 +1,19 @@
1import * as Schema from "effect/Schema";
2
3export class CatalogDependencyResolutionError extends Schema.TaggedErrorClass<CatalogDependencyResolutionError>()(
4 "CatalogDependencyResolutionError",
5 {
6 workspacePackage: Schema.String,
7 dependencyName: Schema.String,
8 catalogSpec: Schema.String,
9 catalogKey: Schema.String,
10 },
11) {
12 override get message(): string {
13 return `Unable to resolve '${this.catalogSpec}' for ${this.workspacePackage} dependency '${this.dependencyName}'. Expected key '${this.catalogKey}' in root workspace catalog.`;
14 }
15}
16
117/**
218 * Resolve `catalog:` dependency specs using the workspace catalog.
319 *
......@@ -7,7 +23,7 @@
723export function resolveCatalogDependencies(
824 dependencies: Record<string, string>,
925 catalog: Record<string, string>,
10 label: string,
26 workspacePackage: string,
1127): Record<string, string> {
1228 return Object.fromEntries(
1329 Object.entries(dependencies).map(([name, spec]) => {
......@@ -20,9 +36,12 @@ export function resolveCatalogDependencies(
2036 const resolved = catalog[lookupKey];
2137
2238 if (typeof resolved !== "string" || resolved.length === 0) {
23 throw new Error(
24 `Unable to resolve '${spec}' for ${label} dependency '${name}'. Expected key '${lookupKey}' in root workspace catalog.`,
25 );
39 throw new CatalogDependencyResolutionError({
40 workspacePackage,
41 dependencyName: name,
42 catalogSpec: spec,
43 catalogKey: lookupKey,
44 });
2645 }
2746
2847 return [name, resolved];