diff --git a/web-common/src/features/entity-management/entity-mappers.spec.ts b/web-common/src/features/entity-management/entity-mappers.spec.ts index 4b26370c865..c557979b8db 100644 --- a/web-common/src/features/entity-management/entity-mappers.spec.ts +++ b/web-common/src/features/entity-management/entity-mappers.spec.ts @@ -19,6 +19,24 @@ describe("entity-mappers", () => { expect(getNameFromFile("/path/to/data/adbids.csv.tgz")).toBe("adbids"); }); + it("keeps dots in YAML resource names", () => { + expect(getNameFromFile("/dashboards/dashboard.canvas.yaml")).toBe( + "dashboard.canvas", + ); + }); + + it("keeps dots in YML resource names", () => { + expect(getNameFromFile("/dashboards/dashboard.canvas.yml")).toBe( + "dashboard.canvas", + ); + }); + + it("keeps dots in SQL resource names", () => { + expect(getNameFromFile("/models/orders.latest.sql")).toBe( + "orders.latest", + ); + }); + it("no folder", () => { expect(getNameFromFile("adbids.csv")).toBe("adbids"); }); diff --git a/web-common/src/features/entity-management/entity-mappers.ts b/web-common/src/features/entity-management/entity-mappers.ts index 57bfcd968df..b3976c660ef 100644 --- a/web-common/src/features/entity-management/entity-mappers.ts +++ b/web-common/src/features/entity-management/entity-mappers.ts @@ -64,9 +64,20 @@ export function getFileAPIPathFromNameAndType( } export function getNameFromFile(fileName: string): string { - // TODO: do we need a library here? const splits = fileName.split("/"); - const extensionSplits = splits[splits.length - 1]?.split("."); + const basename = splits[splits.length - 1] ?? ""; + + // Rill resource names are inferred by removing only the final resource file + // extension, so dotted names like `dashboard.canvas.yaml` stay intact. + for (const extension of [".yaml", ".yml", ".sql"]) { + if (basename.endsWith(extension)) { + return basename.slice(0, -extension.length); + } + } + + // Non-resource data files keep the legacy behavior of removing compound + // extensions, e.g. `adbids.csv.tgz` -> `adbids`. + const extensionSplits = basename.split("."); return extensionSplits[0]; }