From f6392b1cfaa132896ccd697fa29d64d0b1201a83 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Aug 2026 16:30:14 +0000 Subject: [PATCH 1/3] Initial plan From ed63dbe2fdf8d858982dd5454e3d81f8444e7604 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:19:20 +0000 Subject: [PATCH 2/3] fix(compiler): reject spreads that add properties to array models Co-authored-by: timotheeguerin <1031227+timotheeguerin@users.noreply.github.com> --- packages/compiler/src/core/checker.ts | 13 +++++++++ packages/compiler/test/checker/model.test.ts | 28 ++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/compiler/src/core/checker.ts b/packages/compiler/src/core/checker.ts index 8d2203984d9..75624e55a98 100644 --- a/packages/compiler/src/core/checker.ts +++ b/packages/compiler/src/core/checker.ts @@ -5254,6 +5254,19 @@ export function createChecker(program: Program, resolver: NameResolver): Checker parentModel, ); + if ( + parentModel.indexer?.key.name === "integer" && + (newProperties.length > 0 || additionalIndexer !== undefined) + ) { + reportCheckerDiagnostic( + createDiagnostic({ + code: "no-array-properties", + target: prop.target, + }), + ); + continue; + } + if (additionalIndexer) { if (spreadIndexers) { spreadIndexers.push(additionalIndexer); diff --git a/packages/compiler/test/checker/model.test.ts b/packages/compiler/test/checker/model.test.ts index 5555a516397..2ba67205e5f 100644 --- a/packages/compiler/test/checker/model.test.ts +++ b/packages/compiler/test/checker/model.test.ts @@ -704,6 +704,34 @@ describe("with is", () => { }); }); + it("model is array cannot spread record properties", async () => { + const diagnostics = await Tester.diagnose(` + model A is Array { + ...Record; + } + `); + expectDiagnostics(diagnostics, { + code: "no-array-properties", + message: "Array models cannot have any properties.", + }); + }); + + it("model extends array cannot spread model properties", async () => { + const diagnostics = await Tester.diagnose(` + model Source { + name: string; + } + + model A extends Array { + ...Source; + } + `); + expectDiagnostics(diagnostics, { + code: "no-array-properties", + message: "Array models cannot have any properties.", + }); + }); + it("doesn't allow duplicate properties", async () => { const diagnostics = await Tester.diagnose(` model A { x: int32 } From 4e2fe195d97742e6691718da88339fcde899e9f2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Aug 2026 12:20:16 +0000 Subject: [PATCH 3/3] fix(compiler): use array-model check for spread validation Co-authored-by: timotheeguerin <1031227+timotheeguerin@users.noreply.github.com> --- packages/compiler/src/core/checker.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/compiler/src/core/checker.ts b/packages/compiler/src/core/checker.ts index 75624e55a98..eadd4c977bb 100644 --- a/packages/compiler/src/core/checker.ts +++ b/packages/compiler/src/core/checker.ts @@ -5254,10 +5254,7 @@ export function createChecker(program: Program, resolver: NameResolver): Checker parentModel, ); - if ( - parentModel.indexer?.key.name === "integer" && - (newProperties.length > 0 || additionalIndexer !== undefined) - ) { + if (isArrayModelType(parentModel) && (newProperties.length > 0 || additionalIndexer !== undefined)) { reportCheckerDiagnostic( createDiagnostic({ code: "no-array-properties",