{"record":{"id":"47ee0c7b9b5e7457","repo":"remotion-dev/remotion","slug":"name-must-be-max-but-got-json-string","errorCode":null,"errorMessage":"\"${name}\" must be <= ${max}, but got ${JSON.stringify(value)}","messagePattern":"\"(.+?)\" must be <= (.+?), but got (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/effects/src/noise-displacement.ts","lineNumber":214,"sourceCode":"\n\tif (!Number.isInteger(value)) {\n\t\tthrow new TypeError(\n\t\t\t`\"${name}\" must be an integer, but got ${JSON.stringify(value)}`,\n\t\t);\n\t}\n};\n\nconst validatePositive = (value: number, name: string): void => {\n\tif (value <= 0) {\n\t\tthrow new TypeError(\n\t\t\t`\"${name}\" must be greater than 0, but got ${JSON.stringify(value)}`,\n\t\t);\n\t}\n};\n\nconst validateMax = (value: number, max: number, name: string): void => {\n\tif (value > max) {\n\t\tthrow new TypeError(\n\t\t\t`\"${name}\" must be <= ${max}, but got ${JSON.stringify(value)}`,\n\t\t);\n\t}\n};\n\nconst validateNoiseDisplacementParams = (\n\tparams: NoiseDisplacementParams,\n): void => {\n\tassertEffectParamsObject(params, 'Noise Displacement');\n\tassertRequiredUvCoordinate(params.center, 'center');\n\tassertRequiredFiniteNumber(params.radius, 'radius');\n\tassertOptionalFiniteNumber(params.strength, 'strength');\n\tassertOptionalFiniteNumber(params.seed, 'seed');\n\tassertOptionalFiniteNumber(params.grainSize, 'grainSize');\n\tassertOptionalFiniteNumber(params.passes, 'passes');\n\tassertOptionalIntegerNumber(params.passes, 'passes');\n\tassertOptionalFiniteNumber(params.blur, 'blur');\n\tassertOptionalFiniteNumber(params.feather, 'feather');","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/noise-displacement.ts#L196-L232","documentation":"validateMax throws this TypeError when the noiseDisplacement `passes` prop exceeds the maximum allowed value of 12 (MAX_PASSES). This is checked after validatePositive confirms passes > 0. The shader uses a fixed loop bound of 12 iterations, so values above 12 cannot be honored.","triggerScenarios":"Calling noiseDisplacement({ passes: 13 }) or any integer value greater than 12. Values like passes: 20, passes: 100, etc.","commonSituations":"Assuming more passes means better quality and setting a high number; dynamic computation that exceeds 12; copy-pasting from examples with different limits; misunderstanding the shader's fixed loop constraint.","solutions":["Set passes to an integer between 1 and 12: noiseDisplacement({ passes: 6 }).","If you need more samples, combine with a higher grainSize or strength instead.","Clamp dynamic values: passes: Math.min(12, Math.max(1, Math.round(value))).","Omit passes to use the default of 6."],"exampleFix":"// before\nnoiseDisplacement({ center: [0.5, 0.5], radius: 0.5, passes: 20 })\n\n// after\nnoiseDisplacement({ center: [0.5, 0.5], radius: 0.5, passes: 12 })","handlingStrategy":"validation","validationCode":"// Validate passes upper bound before calling noiseDisplacement()\nconst MAX_PASSES = 12;\nif (params.passes !== undefined && params.passes > MAX_PASSES) {\n  throw new Error(`passes must be <= ${MAX_PASSES}, got ${params.passes}`);\n}\nconst result = noiseDisplacement(params);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember the hard cap of 12 passes — the shader loop is fixed at 12 iterations.","Clamp dynamic values: Math.min(12, Math.max(1, Math.round(value))).","Omit passes to use the sensible default of 6."],"tags":["validation","typescript","noise-displacement","params","typeerror"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}