Skip to content

Commit

Permalink
chore: added codemods to migrate v3 -> v4 (#104)
Browse files Browse the repository at this point in the history
  • Loading branch information
mehimanshupatil authored Feb 9, 2024
1 parent 57873c1 commit 242e6a6
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 1 deletion.
8 changes: 8 additions & 0 deletions codemods/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "codemods",
"version": "0.0.0",
"type": "commonjs",
"exports": {
"./package.json": "./package.json"
}
}
29 changes: 29 additions & 0 deletions codemods/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Codemod

## V4
convert named export to default

If you want to run it against `.js` or `.jsx` files, please use the command below:

```
npx jscodeshift@latest ./path/to/src/ \
--extensions=js,jsx \
--transform=./node_modules/vite-plugin-svgr/codemods/src/v4/default-export/default-export.js
```

If you want to run it against `.ts` or `.tsx` files, please use the command below:

```
npx jscodeshift@latest ./path/to/src/ \
--extensions=ts,tsx \
--parser=tsx \
--transform=./node_modules/vite-plugin-svgr/codemods/src/v4/default-export/default-export.js
```

**Note:** Applying the codemod might break your code formatting, so please don't forget to run `prettier` and/or `eslint` after you've applied the codemod!

Above codemod will convert as imports as bellow
```diff
- import { ReactComponent as NoticeModeIconActive2 } from 'assets/icon.svg';
+ import NoticeModeIconActive2 from 'assets/icon.svg?react';
```
32 changes: 32 additions & 0 deletions codemods/src/v4/default-export/default-export.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
module.exports = function (file, api) {
const jscodeshift = api.jscodeshift;
const root = jscodeshift(file.source);

root.find(jscodeshift.ImportDeclaration).forEach((path) => {
const importPath = path.node.source.value;

if (importPath.endsWith('.svg')) {

const hasDefaultSpecifier = path.node.specifiers.some(specifier =>
jscodeshift.ImportDefaultSpecifier.check(specifier)
);

// Skip transformation if there is a default import specifier
if (!hasDefaultSpecifier) {
const updatedImportPath = `${importPath}?react`;

path.node.specifiers.forEach(specifier => {
if (jscodeshift.ImportSpecifier.check(specifier)) {
// Convert named import to default import
const newSpecifier = jscodeshift.importDefaultSpecifier(jscodeshift.identifier(specifier.local.name));
specifier.type = 'ImportDefaultSpecifier';
specifier.local = newSpecifier.local;
}
});

path.node.source = jscodeshift.literal(updatedImportPath);
}
}
});
return root.toSource();
};
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
"repository": "pd4d10/vite-plugin-svgr",
"files": [
"dist",
"client.d.ts"
"client.d.ts",
"codemods"
],
"keywords": [
"vite",
Expand Down

0 comments on commit 242e6a6

Please sign in to comment.