From dd363175f079a3559a0d4ebccc5d4f674c80702a Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Tue, 1 Sep 2026 19:04:59 +0000 Subject: [PATCH] fix(pike): validate array cardinality --- .../quicktype-core/src/language/Pike/PikeRenderer.ts | 11 +++++++++++ test/languages.ts | 1 + 2 files changed, 12 insertions(+) diff --git a/packages/quicktype-core/src/language/Pike/PikeRenderer.ts b/packages/quicktype-core/src/language/Pike/PikeRenderer.ts index 95e6d78ee7..c815f3fa51 100644 --- a/packages/quicktype-core/src/language/Pike/PikeRenderer.ts +++ b/packages/quicktype-core/src/language/Pike/PikeRenderer.ts @@ -3,6 +3,7 @@ import { type ForbiddenWordsInfo, } from "../../ConvenienceRenderer.js"; import { + minMaxItemsForType, minMaxLengthForType, minMaxValueForType, } from "../../attributes/Constraints.js"; @@ -348,6 +349,16 @@ export class PikeRenderer extends ConvenienceRenderer { this.emitLine( `if (${optionalGuard}sizeof(${jsonValue}) > ${maxLength}) error("String too long");`, ); + const [minItems, maxItems] = + minMaxItemsForType(p.type) ?? []; + if (minItems !== undefined) + this.emitLine( + `if (${optionalGuard}sizeof(${jsonValue}) < ${minItems}) error("Array too short");`, + ); + if (maxItems !== undefined) + this.emitLine( + `if (${optionalGuard}sizeof(${jsonValue}) > ${maxItems}) error("Array too long");`, + ); const rejectsArray = p.type instanceof UnionType && nullableFromUnion(p.type) === null && diff --git a/test/languages.ts b/test/languages.ts index e7fdedae0d..e10b25688c 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -1499,6 +1499,7 @@ export const PikeLanguage: Language = { "minmax", "minmaxInteger", "minmaxlength", + "minmaxitems", ], output: "TopLevel.pmod", topLevel: "TopLevel",