Skip to content

[p5.js 2.0+ Bug Report]: FES omits parameter position for any parameter after the first #9151

Description

@Shruti2110-coder

Most appropriate sub-area of p5.js?

  • Accessibility
  • Color
  • Core/Environment/Rendering
  • Data
  • DOM
  • Events
  • Image
  • IO
  • Math
  • Typography
  • Utilities
  • WebGL
  • WebGPU
  • p5.strands
  • Build process
  • Unit testing
  • Internationalization
  • Friendly errors
  • Other (specify if possible)

p5.js version

current main (2.x dev)

Web browser and version

Chrome for Testing (Chromium, via Vitest browser runner)

Operating system

macOS

Steps to reproduce this

Any function whose parameter validation fails on the second or later
parameter produces a message with the position word missing and a doubled
space:

Expected string at the  parameter in loadModel().

Failures on the first parameter are correct:

Expected Color at the first parameter in background().

Reproduction

npx vitest run test/unit/visual/cases/webgl.js 2>&1 | grep "Expected"

Eight instances from loadModel(), all missing the ordinal, alongside a
correct background() message in the same run.

Cause

src/friendly_errors/fes.js:134 holds a single-entry lookup:

ordinals: [TL.tl`first`],

param_validator.js reads it in the invalid_type (line 539) and custom
(line 553) branches:

const position = FES.premade.ordinals[currentError.path.join('.')];

Any Zod error path other than [0] returns undefined. Line 542 interpolates
it with no guard, so undefined renders as an empty string between two
spaces.

Confirmed by adding a temporary log in the invalid_type branch:

PATH: [1] ORDINAL: undefined     (loadModel — broken)
PATH: [0] ORDINAL: first         (texture — correct)

Origin

Commit f5b7595 ("Work in progress proof of concept FES revamp using new
translation utility", Apr 2026) introduced FES.premade.ordinals with the
single placeholder entry and pointed these two branches at it.

param_validator.js:107 still holds the complete list — 'first' through
'tenth' — from the earlier implementation, but only buildTypeMismatchMessage
uses it. So the file has two ordinal lists and the branches that matter use
the incomplete one.

Related prior work: #4626 / PR #4629 added localised ordinals in v1.1.3. The
proposal there was "a list of ordinal full forms (first, second, third, ...)
for numbers 1 to 10 for all languages in the translation files", which is
presumably what FES.premade.ordinals was intended to become.

Scope

Affects every p5 function whose validation fails after the first parameter,
not just loadModel.

I'd like to work on this if approved, but since the fix touches translation
strings I'd want a steward's view on the right approach first.

Node v22.22.2, Vitest 4.1.10.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions