Migrating `propsTransformer` from AMD to ESM in a custom MVC Portlet

Hi,

We’re migrating a custom OSGi MVC Portlet from Liferay DXP 2024.Q1 to 2026.Q1 and we need some guidance on the JS migration path.

Our module is a standard MVC Portlet that uses propsTransformer in Clay taglibs:

<clay:management-toolbar
    managementToolbarDisplayContext="${toolbar}"
    propsTransformer="js/ManagementToolbarPropsTransformer"
/>

The transformer JS files import from Liferay modules:

import { openSelectionModal, getCheckedCheckboxes } from 'frontend-js-web';

export default function propsTransformer({ portletNamespace, ...props }) {
    return {
        ...props,
        onActionButtonClick: (event, {item}) => { ... }
    };
}

The build currently uses liferay-npm-bundler + Babel to produce AMD modules.

Knowing that both liferay-npm-bundler and the AMD loader are deprecated (LPD-48372), what would be the recommended migration steps for this kind of module?

Specifically:

  1. Build tooling — What replaces liferay-npm-bundler? (esbuild, webpack, vite…?)
  2. propsTransformer syntax — How should it be used in 2026.Q1 for a custom external module? We’ve seen the {ClassName} from module-name syntax in Liferay’s own source code (e.g. trash-web) but we’re not sure if and how it applies to custom modules.
  3. frontend-js-web imports — How should imports from Liferay-provided modules be handled in the new setup?

Thanks in advance!

Javier, would you be able to share with me the project module? I have the frontend team ready to help with this, but they'd like to look at what you have for a reference...