From aaae51a69fb546748d4d657cbfc03dbd13611df6 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 7 Oct 2024 10:40:32 -0700 Subject: [PATCH] Project source models (#4445) fix [#4280](https://github.com/microsoft/typespec/issues/4280) --------- Co-authored-by: Christopher Radek <14189820+chrisradek@users.noreply.github.com> --- ...x-project-source-models-2024-8-13-15-15-44.md | 7 +++++++ packages/compiler/src/core/projector.ts | 4 ++++ .../test/projection/projector-identity.test.ts | 16 ++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 .chronus/changes/fix-project-source-models-2024-8-13-15-15-44.md diff --git a/.chronus/changes/fix-project-source-models-2024-8-13-15-15-44.md b/.chronus/changes/fix-project-source-models-2024-8-13-15-15-44.md new file mode 100644 index 0000000000..9687ec4a92 --- /dev/null +++ b/.chronus/changes/fix-project-source-models-2024-8-13-15-15-44.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/compiler" +--- + +[API] model `sourceModels` property are now projected correctly diff --git a/packages/compiler/src/core/projector.ts b/packages/compiler/src/core/projector.ts index ea455acdc9..60821d1b72 100644 --- a/packages/compiler/src/core/projector.ts +++ b/packages/compiler/src/core/projector.ts @@ -302,6 +302,10 @@ export function createProjector( projectedModel.sourceModel = projectType(model.sourceModel) as Model; } + projectedModel.sourceModels = model.sourceModels.map((source) => { + return { ...source, model: projectType(source.model) as Model }; + }); + if (model.indexer) { const projectedValue = projectType(model.indexer.value); projectedModel.indexer = { diff --git a/packages/compiler/test/projection/projector-identity.test.ts b/packages/compiler/test/projection/projector-identity.test.ts index 902e419c75..5a0bfdb85c 100644 --- a/packages/compiler/test/projection/projector-identity.test.ts +++ b/packages/compiler/test/projection/projector-identity.test.ts @@ -126,6 +126,22 @@ describe("compiler: projector: Identity", () => { strictEqual(projectResult.type.properties.get("name")?.model, projectResult.type); }); + it("link projected model with sourceModels", async () => { + const code = ` + @test("target") model Foo is Bar { + ...Spreadable + } + model Bar {} + model Spreadable {} + `; + const projectResult = await projectWithNoChange(code, "Model"); + const [sourceBar, sourceSpreadable] = projectResult.type.sourceModels.map((x) => x.model); + const Spreadable = projectResult.globalNamespace.models.get("Spreadable")!; + const Bar = projectResult.globalNamespace.models.get("Bar")!; + strictEqual(sourceBar, Bar); + strictEqual(sourceSpreadable, Spreadable); + }); + it("link projected property with sourceProperty", async () => { const code = ` @test("target") model Foo {