remotion-dev/remotion · error · TypeError
"${name}" must be >= ${min}, but got ${JSON.stringify(value)
Error message
"${name}" must be >= ${min}, but got ${JSON.stringify(value)} What it means
validateAtLeast throws when a pattern() prop resolves to a value below its required minimum (e.g. rowOffsetEvery/columnOffsetEvery must be >= 0, scale must be >= its schema min). The message interpolates the expected minimum and the offending value so the failing prop is obvious.
Source
Thrown at packages/effects/src/pattern.ts:255
return;
}
if (!Number.isInteger(value)) {
throw new TypeError(
`"${name}" must be an integer, but got ${JSON.stringify(value)}`,
);
}
};
const validatePositive = (value: number, name: string): void => {
if (value <= 0) {
throw new TypeError(`"${name}" must be > 0`);
}
};
const validateAtLeast = (value: number, min: number, name: string): void => {
if (value < min) {
throw new TypeError(
`"${name}" must be >= ${min}, but got ${JSON.stringify(value)}`,
);
}
};
const validatePatternParams = (params: PatternParams): void => {
assertEffectParamsObject(params, 'Pattern');
assertOptionalFiniteNumber(params.scale, 'scale');
assertOptionalFiniteNumber(params.cropLeft, 'cropLeft');
assertOptionalFiniteNumber(params.cropTop, 'cropTop');
assertOptionalFiniteNumber(params.cropRight, 'cropRight');
assertOptionalFiniteNumber(params.cropBottom, 'cropBottom');
assertOptionalFiniteNumber(params.gapX, 'gapX');
assertOptionalFiniteNumber(params.gapY, 'gapY');
assertOptionalFiniteNumber(params.offsetU, 'offsetU');
assertOptionalFiniteNumber(params.offsetV, 'offsetV');
assertOptionalFiniteNumber(params.rowOffset, 'rowOffset');
assertOptionalFiniteNumber(params.rowOffsetEvery, 'rowOffsetEvery');View on GitHub (pinned to 78fe4bb3fd)
Solutions
- Keep the prop at or above its documented minimum (the schema declares min per prop).
- Clamp animated values: Math.max(min, value).
- Audit imported config against the patternSchema min/max before passing it through.
Example fix
// before
pattern({ rowOffsetEvery: -1 })
// after
pattern({ rowOffsetEvery: Math.max(0, computedEvery) }) Defensive patterns
Strategy: validation
Validate before calling
// Enforce per-prop minima from the schema before calling pattern().
const MIN = { rowOffsetEvery: 0, columnOffsetEvery: 0 } as const;
function clampMin<T extends keyof typeof MIN>(k: T, v: number | undefined) {
return v === undefined ? undefined : Math.max(MIN[k], v);
}
pattern({
rowOffsetEvery: clampMin('rowOffsetEvery', raw.rowOffsetEvery),
columnOffsetEvery: clampMin('columnOffsetEvery', raw.columnOffsetEvery),
}); Type guard
const isAtLeast = (v: unknown, min: number): v is number => typeof v === 'number' && Number.isFinite(v) && v >= min;
Prevention
- Read each prop's min from patternSchema and clamp accordingly.
- Reject negative values from imported config at the boundary.
- When animating, clamp to the documented floor on every frame.
- Unit-test config-driven values against the schema min/max before rendering.
When it happens
Trigger: Calling pattern() with a prop below its documented min (rowOffsetEvery: -1, columnOffsetEvery: -2), or animating such a prop below the floor. Checked on resolved values in validatePatternParams.
Common situations: Negative defaults inherited from external config; animated counters that dip below zero at the start/end frame; unit conversion errors producing undersized values.
Related errors
- "stops" must be >= ${MIN_STOPS}, but got ${JSON.stringify(st
- "stops" must be <= ${MAX_STOPS}, but got ${JSON.stringify(st
- "${name}" must be >= 1
- "${name}" must be greater than 0, but got ${JSON.stringify(v
- "${name}" must be a [number, number] tuple
AI-assisted analysis of remotion-dev/remotion@78fe4bb3fd (2026-08-12).
Data as JSON: /api/errors/741ac6ce8db2d15e.
Report an issue: GitHub.