{"record":{"id":"3f2a3859fa060023","repo":"remotion-dev/remotion","slug":"name-must-be-a-number-number-tuple-3f2a38","errorCode":null,"errorMessage":"\"${name}\" must be a [number, number] tuple","messagePattern":"\"(.+?)\" must be a \\[number, number\\] tuple","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/effects/src/vignette.ts","lineNumber":184,"sourceCode":"\tradius: p.radius ?? DEFAULT_RADIUS,\n\tfeather: p.feather ?? DEFAULT_FEATHER,\n\troundness: p.roundness ?? DEFAULT_ROUNDNESS,\n\tcolor: p.color ?? DEFAULT_COLOR,\n\tmode: p.mode ?? DEFAULT_MODE,\n\tcenter: [...(p.center ?? DEFAULT_CENTER)] as VignetteCenter,\n});\n\nconst assertOptionalUvCoordinate = (value: unknown, name: string): void => {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (\n\t\t!Array.isArray(value) ||\n\t\tvalue.length !== 2 ||\n\t\tvalue.some((item) => typeof item !== 'number' || !Number.isFinite(item))\n\t) {\n\t\tthrow new TypeError(`\"${name}\" must be a [number, number] tuple`);\n\t}\n};\n\nconst validateVignetteParams = (params: VignetteParams): void => {\n\tassertEffectParamsObject(params, 'Vignette');\n\tassertOptionalFiniteNumber(params.amount, 'amount');\n\tassertOptionalFiniteNumber(params.radius, 'radius');\n\tassertOptionalFiniteNumber(params.feather, 'feather');\n\tassertOptionalFiniteNumber(params.roundness, 'roundness');\n\tassertOptionalColor(params.color, 'color');\n\tassertOptionalEnum(params.mode, 'mode', VIGNETTE_MODES);\n\tassertOptionalUvCoordinate(params.center, 'center');\n\n\tconst r = resolve(params);\n\tvalidateUnitInterval(r.amount, 'amount');\n\tvalidateUnitInterval(r.radius, 'radius');\n\tvalidateUnitInterval(r.feather, 'feather');\n\tvalidateUnitInterval(r.roundness, 'roundness');","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/effects/src/vignette.ts#L166-L202","documentation":"TypeError thrown by vignette's assertOptionalUvCoordinate when params.center is defined but is not exactly a 2-element array of finite numbers. The validator requires [number, number]; it rejects arrays of other lengths, non-arrays, and elements that are not finite numbers (NaN/Infinity included). center is optional, so undefined is accepted and defaults to [0.5, 0.5].","triggerScenarios":"vignette({center: [0.5]}) (length 1), vignette({center: [0.5, 0.5, 0.5]}) (length 3), vignette({center: 'center'}), vignette({center: {x: 0.5, y: 0.5}}), vignette({center: [0.5, NaN]}), or vignette({center: [0.5, '0.5']}).","commonSituations":"Passing an {x,y} object instead of a tuple; truncating or extending the array; serialised values where a number became a string; feeding mouse/pointer coordinates that yield NaN.","solutions":["Pass exactly a [number, number] tuple of finite values, e.g. center: [0.5, 0.5].","If center is optional for your case, omit it to use the default.","Sanitise dynamic input: coerce with Number() and guard Number.isFinite before building the tuple.","Type the prop as readonly [number, number] so the compiler flags shape mistakes."],"exampleFix":"// before\nconst e = vignette({center: {x: 0.5, y: 0.5}}); // throws TypeError\n\n// after\nconst e = vignette({center: [0.5, 0.5]});\n// or omit\nconst e2 = vignette({});","handlingStrategy":"type-guard","validationCode":"const isFiniteTuple2 = (v: unknown): v is [number, number] =>\n  Array.isArray(v) &&\n  v.length === 2 &&\n  v.every((item) => typeof item === 'number' && Number.isFinite(item));\n\nconst center = isFiniteTuple2(config.center) ? config.center : undefined;\nconst e = vignette({center, amount: 0.6});","typeGuard":"const isUvCoordinate = (v: unknown): v is [number, number] =>\n  Array.isArray(v) &&\n  v.length === 2 &&\n  typeof v[0] === 'number' &&\n  typeof v[1] === 'number' &&\n  Number.isFinite(v[0]) &&\n  Number.isFinite(v[1]);","tryCatchPattern":"try {\n  const e = vignette({center: config.center, amount: 0.6});\n} catch (err) {\n  if (err instanceof TypeError) {\n    console.error('Invalid vignette center:', config.center, err);\n  }\n  throw err;\n}","preventionTips":["Type center as readonly [number, number] so shape errors surface at compile time.","Sanitise external/dynamic input with a tuple guard before passing it.","Coerce numeric strings with Number() and reject NaN/Infinity explicitly.","Do not pass {x, y} objects; convert them to [x, y] tuples first."],"tags":["validation","params","vignette","typescript"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}