TargetableESModule
An ECMAScript module that can be changed by a third party.
This class presents a convenient API for consumers to add common transforms to ES Modules in a semantic way.
- TargetableESModule
- .addImport(statement) ⇒
SingleImportStatement
- .uniqueIdentifier(binding) ⇒
string
- .wrapWithFile([exportName], wrapperModule) ⇒
this
- .addImport(statement) ⇒
Adds a static import statement to the module source code, thus importing a new dependency.
This method automatically deduplicates attempts to add imports that would override earlier import bindings. If a collision is detected, it renames the binding before inserting it.
Returns:
SingleImportStatement
— An instance of the SingleImportStatement
class.
Parameters
Name | Type | Description |
---|---|---|
statement | string | SingleImportStatement | A string representing the import statement, or a SingleImportStatement representing it. |
Generates a unique identifier for a given binding. Not guaranteed safe, but good enough in a pinch.
Returns: Parameters
Name | Type | Description |
---|---|---|
binding | string | The binding to change. |
Pass exports of this module through a wrapper module.
Chainable
Returns:
Parameters
Name | Type | Description |
---|---|---|
[exportName] | string | Name of export to wrap. If not provided, will wrap the default export. |
wrapperModule | string | Package-absolute import path to the wrapper module. |
Source Code: pwa-studio/packages/pwa-buildpack/lib/WebpackTools/targetables/TargetableESModule.js
Examples
Code examples for the TargetableESModule
class.
Add and use import statements
Calling the addImport()
function returns a SingleImportStatement
object.
Use this object to refer to the component in your code.
Copied to your clipboardconst logger = esModule.addImport('import logger from "./logger"');esModule.insertAfterSource("./logger';\n", `${logger.binding}('startup')`);
The SingleImportStatement
class overrides its toString()
method to return the value of its .binding
property,
so you can use the object itself in your templates
Copied to your clipboardconst logger = esModule.addImport('import logger from "./logger"');esModule.insertAfterSource("./logger';\n", `${logger}('startup')`);
Import statement limits
The addImport()
function can only handle import statements with a single binding.
For example, the following code is allowed because it only binds VeniaButton
in the statement:
Copied to your clipboardimport { Button as VeniaButton } from "@magento/venia/lib/components/Button";
The following would not be allowed, since it adds two bindings (VeniaButton
and Carousel
):
Copied to your clipboardimport { Button as VeniaButton, Carousel } from "@magento/venia";
Import conflicts
A conflict occcurs when an import statement uses a binding that already belongs to another existing import statement.
For example, you add the logger
import statement in a previous example to a file that already imports another logger
module.
When this happens, the TargetableESModule
class rebinds the logger
object to a different, unique name, such as logger$$2
.
Wrap a module
Use the wrapWithFile()
function to wrap an exported module with another module from a specified file.
Copied to your clipboard// Create a TargetableESModule linked to the useProductFullDetail.js fileconst useProductFullDetails = targetables.esModule("@magento/peregrine/lib/talons/ProductFullDetail/useProductFullDetail.js");// Wrap the `useProductFullDetail` named export from the file with// the default export of `src/targets/wrapper.js` in the `myExtension` package.useProductFullDetails.wrapWithFile("useProductFullDetail","myExtension/src/targets/wrapper");