diff --git a/packages/web/src/lib/erd.test.ts b/packages/web/src/lib/erd.test.ts index b40a8008..06102cc9 100644 --- a/packages/web/src/lib/erd.test.ts +++ b/packages/web/src/lib/erd.test.ts @@ -141,6 +141,14 @@ describe("ERDModel", () => { ).toThrowError("Column 'created__at' must be snake_case."); }); + it("should reject identifiers exceeding length limit", () => { + model.addTable("users"); + const longName = "a".repeat(65); + expect(() => + model.addColumn("users", { name: longName, type: "integer" }), + ).toThrowError("Invalid length for Column identifier."); + }); + it("should reject invalid SQL default values", () => { model.addTable("users"); expect(() => diff --git a/packages/web/src/lib/erd.ts b/packages/web/src/lib/erd.ts index 0cc436c4..5f48e670 100644 --- a/packages/web/src/lib/erd.ts +++ b/packages/web/src/lib/erd.ts @@ -62,7 +62,12 @@ function assertSafeSqlDefaultValue(value: string): void { } } +const MAX_IDENTIFIER_LENGTH = 64; + function assertSnakeCaseIdentifier(kind: string, name: string): void { + if (name.length === 0 || name.length > MAX_IDENTIFIER_LENGTH) { + throw new Error(`Invalid length for ${kind} identifier.`); + } if (!SNAKE_CASE_IDENTIFIER.test(name)) { throw new Error(`${kind} '${name}' must be snake_case.`); }