Skip to content

Conversation

@Mohammed-AlSharafi
Copy link

@Mohammed-AlSharafi Mohammed-AlSharafi commented Jan 17, 2026

Summary

What — What changes are introduced in this PR?

This PR updates the canApplyTranslationTo function within the applyTranslations utility to strictly check if an item is an object before attempting to access its id property.

Why — Why are these changes relevant or necessary?

Currently, the translation utility iterates over all arrays found in an entity. If an entity has a JSONB column containing an array of primitive values (e.g., documents: ["/path/1.pdf", "/path/2.pdf"]), the utility attempts to treat these strings as entities. This causes a server crash (TypeError: Cannot use 'in' operator to search for 'id' in ...) because the code tries to check "id" in string.

How — How have these changes been implemented?

I added an isObject check to the canApplyTranslationTo function in packages/utils/src/translations/apply-translations.ts. The function now returns false for primitive values, preventing the recursion logic from crashing on simple arrays.

Testing — How have these changes been tested, or how can the reviewer test the feature?

I have added a regression test in packages/utils/src/translations/tests/apply-translations.spec.ts. The test:

  1. Creates a mock entity with a field containing an array of strings.
  2. Runs applyTranslations on it.
  3. Verifies that the function completes without throwing a TypeError.

Examples

// Example of an entity structure that caused the crash
const business = {
  id: "business_1",
  title: "My Business",
  // A simple array of strings
  documents: [
    "/usr/share/doc1.pdf", 
    "/usr/share/doc2.pdf"
  ]
}

// Applying translations with ?locale=ar
// Before this fix: Crashes with TypeError
// After this fix: Ignores 'documents' and proceeds normally
await applyTranslations({
  localeCode: "ar",
  objects: [business],
  container: containerMock
})

Checklist

Please ensure the following before requesting a review:

  • I have added a changeset for this PR
    • Every non-breaking change should be marked as a patch
    • To add a changeset, run yarn changeset and follow the prompts
  • The changes are covered by relevant tests
  • I have verified the code works as intended locally
  • I have linked the related issue(s) if applicable

Additional Context

This issue was discovered when using a custom Business entity with a documents JSONB column populated with file path strings. The crash only occurs when the ?locale= query parameter is present.


Note

Improves robustness of apply-translations to avoid crashes on arrays of primitives.

  • Adds isObject guards in canApplyTranslationTo and gatherIds to skip non-objects before accessing id
  • Updates tests in apply-translations.spec.ts with a regression case for arrays of strings
  • Adds a patch changeset for @medusajs/utils

Written by Cursor Bugbot for commit fa7ff37. This will update automatically on new commits. Configure here.

@Mohammed-AlSharafi Mohammed-AlSharafi requested a review from a team as a code owner January 17, 2026 10:26
@changeset-bot
Copy link

changeset-bot bot commented Jan 17, 2026

🦋 Changeset detected

Latest commit: fa7ff37

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 76 packages
Name Type
@medusajs/utils Patch
@medusajs/event-bus-redis Patch
@medusajs/framework Patch
@medusajs/modules-sdk Patch
@medusajs/orchestration Patch
@medusajs/workflows-sdk Patch
@medusajs/cli Patch
@medusajs/medusa-oas-cli Patch
integration-tests-http Patch
@medusajs/medusa Patch
@medusajs/test-utils Patch
@medusajs/analytics Patch
@medusajs/api-key Patch
@medusajs/auth Patch
@medusajs/cache-inmemory Patch
@medusajs/cache-redis Patch
@medusajs/caching Patch
@medusajs/cart Patch
@medusajs/currency Patch
@medusajs/customer Patch
@medusajs/event-bus-local Patch
@medusajs/file Patch
@medusajs/fulfillment Patch
@medusajs/index Patch
@medusajs/inventory Patch
@medusajs/link-modules Patch
@medusajs/locking Patch
@medusajs/notification Patch
@medusajs/order Patch
@medusajs/payment Patch
@medusajs/pricing Patch
@medusajs/product Patch
@medusajs/promotion Patch
@medusajs/rbac Patch
@medusajs/region Patch
@medusajs/sales-channel Patch
@medusajs/settings Patch
@medusajs/stock-location Patch
@medusajs/store Patch
@medusajs/tax Patch
@medusajs/translation Patch
@medusajs/user Patch
@medusajs/workflow-engine-inmemory Patch
@medusajs/workflow-engine-redis Patch
@medusajs/analytics-local Patch
@medusajs/analytics-posthog Patch
@medusajs/auth-emailpass Patch
@medusajs/auth-github Patch
@medusajs/auth-google Patch
@medusajs/caching-redis Patch
@medusajs/file-local Patch
@medusajs/file-s3 Patch
@medusajs/fulfillment-manual Patch
@medusajs/locking-postgres Patch
@medusajs/locking-redis Patch
@medusajs/notification-local Patch
@medusajs/notification-sendgrid Patch
@medusajs/payment-stripe Patch
@medusajs/draft-order Patch
@medusajs/core-flows Patch
@medusajs/oas-github-ci Patch
@medusajs/js-sdk Patch
@medusajs/types Patch
@medusajs/deps Patch
@medusajs/telemetry Patch
@medusajs/admin-bundler Patch
@medusajs/admin-sdk Patch
@medusajs/admin-shared Patch
@medusajs/admin-vite-plugin Patch
@medusajs/dashboard Patch
@medusajs/icons Patch
@medusajs/toolbox Patch
@medusajs/ui-preset Patch
create-medusa-app Patch
medusa-dev-cli Patch
@medusajs/ui Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link

vercel bot commented Jan 17, 2026

Someone is attempting to deploy a commit to the medusajs Team on Vercel.

A member of the Team first needs to authorize it.

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.

This PR is being reviewed by Cursor Bugbot

Details

Your team is on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle for each member of your team.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@Mohammed-AlSharafi Mohammed-AlSharafi force-pushed the fix/utils-array-translation-crash branch from d7bdf45 to fa7ff37 Compare January 17, 2026 10:39
@olivermrbl olivermrbl requested a review from adrien2p January 20, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant