diff --git a/.changeset/enforce-multiquery-limit.md b/.changeset/enforce-multiquery-limit.md new file mode 100644 index 0000000..f122334 --- /dev/null +++ b/.changeset/enforce-multiquery-limit.md @@ -0,0 +1,5 @@ +--- +"@api-wrappers/igdb-wrapper": patch +--- + +Reject typed multi-query builders that exceed IGDB's maximum of 10 query blocks per request. diff --git a/src/__tests__/multi-query-limit.test.ts b/src/__tests__/multi-query-limit.test.ts new file mode 100644 index 0000000..d5307b7 --- /dev/null +++ b/src/__tests__/multi-query-limit.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, test } from "bun:test"; +import { IGDBValidationError } from "../errors"; +import { MultiQueryBuilder } from "../query/MultiQueryBuilder"; + +describe("MultiQueryBuilder limits", () => { + test("allows at most the 10 queries supported by IGDB", () => { + let builder = new MultiQueryBuilder(); + + for (let index = 0; index < 10; index++) { + builder = builder.query("games", `query-${index}`, (query) => + query.limit(1), + ); + } + + expect(builder.inspect().blocks).toHaveLength(10); + expect(() => + builder.query("games", "query-10", (query) => query.limit(1)), + ).toThrow(IGDBValidationError); + }); +}); diff --git a/src/query/MultiQueryBuilder.ts b/src/query/MultiQueryBuilder.ts index 70dcbdf..1c89bd6 100644 --- a/src/query/MultiQueryBuilder.ts +++ b/src/query/MultiQueryBuilder.ts @@ -88,6 +88,12 @@ export class MultiQueryBuilder { build: QueryFactory, count: boolean, ): MultiQueryBuilder { + if (this.#blocks.length >= 10) { + throw new IGDBValidationError( + "multi-query supports at most 10 queries per IGDB request", + ); + } + const normalizedName = name.trim(); if (!normalizedName) { throw new IGDBValidationError("multi-query name is required");