Skip to content

additionalProperties option incorrectly applied to enum/union schemas → Ajv strictTypes error #51

@tsegreto

Description

@tsegreto

When the Prismabox generator option additionalProperties = false is enabled, Prismabox applies additionalProperties: false to non-object schemas generated for Prisma enums (TypeBox Type.Union of literals). Ajv strict mode (strictTypes) rejects additionalProperties unless the schema is type: "object", causing schema compilation to fail.

Example error:

strict mode: missing type "object" for keyword "additionalProperties" at "#/properties/status" (strictTypes)

Reproduction

Prisma schema

generator prismabox {
  provider             = "prismabox"
  additionalProperties = false
}

enum Status {
  active
  inactive
}

model User {
  id     String @id
  status Status
}

Generated output (excerpt)

status: Type.Union([Type.Literal("active"), Type.Literal("inactive")], {
  additionalProperties: false,
}),

Using with Ajv

import Ajv from "ajv";
import { UserPlain } from "./generated/User.js";

const ajv = new Ajv({ strict: true }); // strictTypes enabled by default in strict mode
ajv.compile(UserPlain); // throws

Expected behavior

additionalProperties should only be applied to object schemas, not enums/unions/literals/arrays. Enums should be generated without it:

status: Type.Union([Type.Literal("active"), Type.Literal("inactive")]),

Suggested fix

When emitting TypeBox options, apply additionalProperties only for Type.Object(...) (and other object-like schemas, if any), not for unions/enums/literals/arrays.

Workaround

import { Type } from "@sinclair/typebox";
import { UserPlain } from "./generated/User.js";
import { Status } from "./generated/enums.js";

// Manual enum
export const status = Type.Enum(Status);

// Override in usage
export const UserSchema = Type.Composite([
  Type.Omit(UserPlain, ["status"]),
  Type.Object({ status }),
]);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions