Releases
Automated releases
The Gestalt library development approach is continuous releasing.
Each major, minor, and patch change is merged to master and released as the latest supported Gestalt version. Check the release log.
When a release will cause breaking changes — in usage or in typing — we provide a codemod to ease the upgrade process. Read more about codemods
Our versioning guidelines follow those outlined at semver.org:
Patch: internal fixes, documentation changes, spelling mistakes in code, internal scripts, or package upgrades (anything that consumers of Gestalt don't need to worry about)
Minor: any new functionality or properties for a component, or net-new
components,Major: any breaking change, whether it be in a specific component or the library itself (will most likely include a codemod
How do these automated releases work under the hood? Automated releases use GitHub actions with these release steps for every merge on master:
- Fetch semver label for the associated PR (patch / minor / major)
- Check out the repository
- Setup Node.js
- Bump package.json version
- Update CHANGELOG.md file
- Create GitHub release
- Publish to npm
- Update Gestalt documentation
Codemods
Run codemods to automate required code changes related to major releases (breaking changes in usage or in typing) in Gestalt.
Every major release in the component library comes with a codemod to ease the upgrade of the Gestalt dependency. Some codemods are custom built for each upgrade while others take advantage of generic codemods that only require running a codemod command with arguments.
When releases include breaking changes, the specific codemod command is included in the pull request.
Run the relevant codemod(s) in the relevant directory of your repo (not the Gestalt repo) anywhere the component to be updated is used.
For a dry run to see what the changes will be, add the -d (dry run) and -p (print output) flags to pipe stdout to a file for easier inspection if you like.
Do you want to learn more about how codemods work or want to start developing generic codemods? Read our codemod README for a walkthrough of the development process.
Generic codemods
Generic codemods for common tasks like renaming components or props can be found in this directory.
Codemods modifying prop-values also throw errors when they encouter spread props used in Gestalt components. Spread props are opaque to codemods and require manual action.
Error messages include the location (file path) and the code line of the node that caused the error to facilitate addressing the corresponding issue.
renameComponent
Codemod to RENAME Gestalt components
Example: transforms first code (top) into second code (bottom)
import { Flyout } from 'gestalt'
<Flyout />
import { Popover } from 'gestalt'
<Popover />
To run this codemod, use the following command in your terminal:
yarn codemod renameComponent ~/path/to/your/code
--componentName=string
--nextComponentName=string
Arguments:
- --componentName: current component name to be replaced
- --nextComponentName: new component name to replace with
Both componentName & nextComponentName are required.
Example:
yarn codemod renameComponent ~/code/pinboard/webapp
--componentName=Flyout
--nextComponentName=Popover
See codemod code: renameComponent
modifyProp
Codemod to MODIFY (REPLACE or REMOVE) Gestalt component props.
Example (REPLACE): transforms first code (top) into second code (bottom)
import { Box } from 'gestalt'
<Box size="" />
import { Box } from 'gestalt'
<Box renamedSize="" />
Example (REMOVE): transforms first code (top) into second code (bottom)
import { Box } from 'gestalt'
<Box size="" />
import { Box } from 'gestalt'
<Box />
To run this codemod, use the following command in your terminal:
yarn codemod modifyProp ~/path/to/your/code
--component=string
--subcomponent=string
--previousProp=string
--nextProp=string
Arguments:
- --component: component to which modify props
- --subcomponent (optional): component's subcomponent to which modify props
- --previousProp: current prop name to be replaced
- --nextProp (optional): new prop name to replace with
If all options are passed, previousProp is replaced with nextProp (REPLACE)
In the absence of nextProp, the codemod removes previousProp (REMOVE)
Examples (REPLACE):
yarn codemod modifyProp ~/code/pinboard/webapp
--component=Box
--previousProp=size
--nextProp=renamedSize
yarn codemod modifyProp ~/code/pinboard/webapp
--component=Dropdown
--subcomponent=Item
--previousProp=size
--nextProp=renamedSize
Example (REMOVE):
yarn codemod modifyProp ~/code/pinboard/webapp
--component=Box
--previousProp=size
See codemod code: modifyProp
modifyPropValue
Codemod to MODIFY (REPLACE, ADD, or REMOVE) prop-value combinations in Gestalt component. It supports string, number, and boolean values.
Example (REPLACE): transforms first code (top) into second code (bottom)
import { Box } from 'gestalt'
<Box color="red" />
import { Box } from 'gestalt'
<Box variant="error" />
Example (ADD): transforms first code (top) into second code (bottom)
import { Box } from 'gestalt'
<Box />
import { Box } from 'gestalt'
<Box variant="error"/>
Example (REMOVE): transforms first code (top) into second code (bottom)
import { Box } from 'gestalt'
<Box color="red" />
import { Box } from 'gestalt'
<Box />
To run this codemod, use the following command in your terminal:
* yarn codemod modifyPropValue ~/path/to/your/code
* --component=string
* --subcomponent=string
* --previousProp=string
* --nextProp=string
* --previousValue=string|number|boolean
* --nextValue=string|number|boolean
Arguments:
- --component: component to which modify props
- --subcomponent (optional): component's subcomponent to which modify props
- --previousProp (optional): current prop name to be replaced
- --nextProp (optional): new prop name to replace with, null if we want to remove prop
- --previousValue (optional): current prop name to be replaced
- --nextValue (optional): new prop name to replace with, null if we want to remove prop
If all options passed, prop+value combination are replaced with new prop+value combination (REPLACE)
In the absence of nextProp, the codemod only replaces the prop value (REPLACE)
In the absence of nextValue, the codemod only replaces the prop name for that prop+value combination (REPLACE)
In the absence of previousProp & previousValue, the codemod adds a new prop with value (ADD)
In the absence of nextProp & nextValue, the codemod removes the prop with that particular value (REMOVE)
Examples (REPLACE):
yarn codemod modifyPropValue ~/code/pinboard/webapp
--component=Box
--previousProp=color
--nextProp=variant
--previousValue=400
--nextValue=error
yarn codemod modifyPropValue ~/code/pinboard/webapp
--component=Box
--previousProp=color
--previousValue=400
--nextValue=error
yarn codemod modifyPropValue ~/code/pinboard/webapp
--component=Box
--previousProp=color
--nextProp=variant
--previousValue=400
Example (ADD):
yarn codemod modifyPropValue ~/code/pinboard/webapp
--component=Box
--nextProp=variant
--nextValue=error
Example (REMOVE):
yarn codemod modifyPropValue ~/code/pinboard/webapp
--component=Box
--previousProp=color
--previousValue=red
See codemod code: modifyPropValue
detectManualReplacement
Codemod to DETECT COMPLEX MANUAL CHANGES of components, props, and prop-value combinations in Gestalt components. The codemod throws error messages upon detection of matching instances. Supports string, number, and boolean values.
Example: throws an error when detects that the arguments matching in code (top) so that engingeers can manually refactor the code.
import { Icon } from 'gestalt'
<Icon icon="warning" />
import { Status } from 'gestalt'
<Status icon="warning" size="sm" />
To run this codemod, use the following command in your terminal:
yarn codemod detectManualReplacement ~/path/to/your/code
--component=string
--subcomponent=string
--prop=string
--value=string|number|boolean
Arguments:
- --component: component to which modify props
- --subcomponent (optional): component's subcomponent to which modify props
- --prop (optional): current prop name to be replaced
- --value (optional): new prop name to replace with, null if we want to remove prop
If all options are passed, previousProp is replaced with nextProp (REPLACE)
In the absence of nextProp, the codemod removes previousProp (REMOVE)
Example:
yarn codemod detectManualReplacement ~/code/pinboard/webapp
--component=Box
--prop=color
value=error
See codemod code: detectManualReplacement
Custom release codemods
Custom codemods are only necessary when generic codemods cannot support major releases with complex breaking API changes.
Custom codemods can be found in this directory under the corresponding upgrade version. The name of the folder should reflect the resulting version number of your PR.
Example usage for a codebase using Flow:
yarn codemod --parser=flow -t={relative/path/to/codemod} relative/path/to/your/code