Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/rip21/styled-components-v3-to-v4-codemod
Codemod to migrate deprecated .extend API in favor of only styled functions.
https://github.com/rip21/styled-components-v3-to-v4-codemod
babel-codemod codemod styled-components v4
Last synced: 2 months ago
JSON representation
Codemod to migrate deprecated .extend API in favor of only styled functions.
- Host: GitHub
- URL: https://github.com/rip21/styled-components-v3-to-v4-codemod
- Owner: RIP21
- License: mit
- Created: 2018-08-27T12:38:38.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2018-11-12T16:35:29.000Z (about 6 years ago)
- Last Synced: 2024-04-23T13:18:39.329Z (8 months ago)
- Topics: babel-codemod, codemod, styled-components, v4
- Language: JavaScript
- Size: 37.1 KB
- Stars: 7
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# styled-components-v3-to-v4-codemod
[![npm version](https://badge.fury.io/js/styled-components-v3-to-v4-codemod.svg)](https://badge.fury.io/js/styled-components-v3-to-v4-codemod)
### This codemod has been adopted by `styled-components`, please use it instead [styled-components-codemods](https://github.com/styled-components/styled-components-codemods)
Codemod to for `styled-components` to migrate from `v3`to `v4`.
In version 4 of `styled-components` the `.extends` API will be removed.
This codemod helps replace all of `.extends` usages to equivalent
with `styled()` call instead.
Also imports will be added if `styled` import is not present.Before:
```javascript
StyledComponent.extend``StyledComponent.extend`color: red;`
StyledComponent.extend({ color: "red" })
StyledComponent.extend
StyledComponent.extend``.extend
StyledComponent.extend({ color: red }).extend
styled.div``.extend``
styled.div`color: red;`.extend`color: blue;`
styled.div({ color: "red"}).extend({ color: "blue"})
StyledComponent.withComponent('div').extend``
StyledComponent.withComponent('div').extend`color: red;`
StyledComponent.withComponent('div').extend()
StyledComponent.withComponent('div').extend({ color: red })
StyledComponent.extend().extend().extend().extend``
StyledComponent.extend``.extend().extend``.extend``
```After:
```jsx harmony
import styled, { css } from 'styled-components'styled(StyledComponent)``
styled(StyledComponent)`
color: red;
`styled(StyledComponent)({ color: 'red' })
styled(StyledComponent)
styled(styled(StyledComponent)``)
styled(styled(StyledComponent)({ color: red }))
styled(styled.div``)``
styled(
styled.div`
color: red;
`
)`
color: blue;
`styled(styled.div({ color: 'red' }))({ color: 'blue' })
styled(StyledComponent.withComponent('div'))``
styled(StyledComponent.withComponent('div'))`
color: red;
`styled(StyledComponent.withComponent('div'))()
styled(StyledComponent.withComponent('div'))({ color: red })
styled(styled(styled(styled(StyledComponent)())())())``
styled(styled(styled(styled(StyledComponent)``)())``)``
```## Usage
Install [babel-codemod](https://github.com/square/babel-codemod) `npm i -g babel-codemod`
Then install in root of your project `npm install styled-components-v3-to-v4-codemod`
Run it like that from `node_modules` hence:
```
codemod --plugin ./node_modules/styled-components-v3-to-v4-codemod/src/index.js ./src
```Also you may like to pretty print it using `prettier` instead of `recast`
```
codemod --plugin ./node_modules/styled-components-v3-to-v4-codemod/src/index.js ./src --printer prettier
```Remove `styled-components-v3-to-v4-codemod` from `package.json`
If there is any issues, let me know in the issues tab here at GitHub.
## Limitations
There is no way to distinct from AST whether `.extend` identifier is related to `styled-components`
or any other library/prototype etc. So if you know that there is some
`.extend` function in your project that is not related to `styled-components` be aware
and revert such changes manually diffing your code afterwards.Also be aware that `.extend` in some rare cases is not equal `styled` and this codemod doesn't cover this case.
Refer to this [issue](https://github.com/styled-components/styled-components/issues/1956) to understand the difference.
It's rare usage, so fix it manually. Shouldn't be a big deal.## Integration with WebStorm/VS Code to do migration file by file
Preconditions:
```
npm i -g babel-core babel-codemod styled-components-v3-to-v4-codemod
```### WebStorm:
1. Go to Preferences -> External Tools -> Click plus to add tool.
2. Config:```
Name: SC v3 to v4
Program: codemod
Arguments: -p /usr/local/lib/node_modules/styled-components-v3-to-v4-codemod/src/index.js$FilePathRelativeToProjectRoot$
Working directory: $ProjectFileDir$In advanced settings:
Tick on: Sync file after execution
```3. Open file you want to transform
`Right Click -> External Tools -> SC v3 to v4 -> Apply prettier/code formatting -> Enjoy`
4. For even better experience go to.
`Preferences -> Keymap -> External Tools -> External Tools -> h to JSX -> Attach some key combination`### VS Code:
1. Open command pallete
2. `>Tasks: Configure Task`
3. Press Up -> Select: `Task from tasks.json template` (or something like that)
4. Copy and paste this:```
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "SC v3 to v4",
"type": "shell",
"command": "codemod -p /usr/local/lib/node_modules/styled-components-v3-to-v4-codemod/src/index.js ${file}"
}
]
}
```5. Open command pallete and ask it to open `keybindings.json`
6. Add this:```
{
"key": "cmd+e",
"command": "workbench.action.tasks.runTask",
"args": "SC v3 to v4"
}
```7. Open any file and press cmd+e to apply codemod on file.
8. Or if you don't want to bloat your `keybindings.json` just open Command pallete and type.
`Run task -> Enter -> Find in the list "H to JSX" -> Enter` (Usually will be on top)
9. Apply formatting and enjoy