[p5.js 2.0+ Bug Report]: FES omits parameter position for any parameter after the first
Nobody has claimed this yet.
- Dominant language
- JavaScript
- Stars
- 24k
- Forks
- 3.8k
- Avg merge
- 3d 16h
- Merged PRs (30d)
- 25
Description
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 f5b75951b ("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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with src/friendly_errors/fes.js:134 and the invalid_type and custom branches in param_validator.js at lines 539 and 553. Run the reported Vitest command to reproduce the missing ordinals, then verify that later parameters receive the appropriate localized position and that the affected validation messages are covered by tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- developer-experience, internationalization, testing-qa
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 78/100