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.
const 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
const 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:
import { Button as VeniaButton } from '@magento/venia/lib/components/Button'
The following would not be allowed, since it adds two bindings (VeniaButton
and Carousel
):
import { 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.
// Create a TargetableESModule linked to the useProductFullDetail.js file
const 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'
);