diff --git a/src/color/creating_reading.js b/src/color/creating_reading.js
index f848ba3a25..f838c4ceff 100644
--- a/src/color/creating_reading.js
+++ b/src/color/creating_reading.js
@@ -1540,8 +1540,8 @@ function creatingReading(p5, fn){
* colorMode().
*
* @method paletteLerp
- * @param {[p5.Color|String|Number|Number[], Number][]} colors_stops color stops to interpolate from
- * @param {Number} amt number to use to interpolate relative to color stops
+ * @param {Array.>} colors_stops color stops to interpolate from
+ * @param {Number} amt number to use to interpolate relative to color stops
* @return {p5.Color} interpolated color.
*
* @example
diff --git a/utils/generate-types.js b/utils/generate-types.js
index c2dead7c2f..6992f6b41d 100644
--- a/utils/generate-types.js
+++ b/utils/generate-types.js
@@ -212,14 +212,52 @@ function generateTypeFromTag(param) {
return normalizeTypeName(param.type.name);
case 'TypeApplication':
const baseType = normalizeTypeName(param.type.expression.name);
+
+ // Handle array cases
+ if (baseType === 'Array') {
+ const innerType = param.type.applications[0];
+
+ // Handle nested array that represents a tuple
+ if (innerType.type === 'TypeApplication' &&
+ innerType.expression.name === 'Array') {
+ // Get all tuple element types
+ const tupleTypes = innerType.applications
+ .map(app => generateTypeFromTag({ type: app }))
+ .join(', ');
+ return `Array<[${tupleTypes}]>`;
+ }
+
+ // Handle array with union type
+ if (innerType.type === 'UnionType') {
+ const unionTypes = innerType.elements
+ .map(el => generateTypeFromTag({ type: el }))
+ .join(' | ');
+ // If this is part of a tuple structure (has sibling types), wrap in tuple
+ if (param.type.applications.length > 1) {
+ const remainingTypes = param.type.applications
+ .slice(1)
+ .map(app => generateTypeFromTag({ type: app }))
+ .join(', ');
+ return `Array<[${unionTypes}, ${remainingTypes}]>`;
+ }
+ return `Array<${unionTypes}>`;
+ }
+
+ // Regular array
+ const typeParam = generateTypeFromTag({ type: innerType });
+ return `Array<${typeParam}>`;
+ }
+
+ // Regular type application
const typeParams = param.type.applications
.map(app => generateTypeFromTag({ type: app }))
.join(', ');
return `${baseType}<${typeParams}>`;
case 'UnionType':
- return param.type.elements
+ const unionTypes = param.type.elements
.map(el => generateTypeFromTag({ type: el }))
.join(' | ');
+ return unionTypes;
case 'OptionalType':
return generateTypeFromTag({ type: param.type.expression });
case 'AllLiteral':
@@ -230,6 +268,16 @@ function generateTypeFromTag(param) {
return `'${param.type.value}'`;
case 'UndefinedLiteralType':
return 'undefined';
+ case 'ArrayType':
+ // Check if it's a tuple type (array with specific types for each position)
+ if (param.type.elements) {
+ const tupleTypes = param.type.elements
+ .map(el => generateTypeFromTag({ type: el }))
+ .join(', ');
+ return `[${tupleTypes}]`;
+ }
+ // Regular array type
+ return `${generateTypeFromTag({ type: param.type.elementType })}[]`;
default:
return 'any';
}