diff --git a/codemods/package.json b/codemods/package.json new file mode 100644 index 0000000..e4b39e6 --- /dev/null +++ b/codemods/package.json @@ -0,0 +1,8 @@ +{ + "name": "codemods", + "version": "0.0.0", + "type": "commonjs", + "exports": { + "./package.json": "./package.json" + } +} diff --git a/codemods/readme.md b/codemods/readme.md new file mode 100644 index 0000000..84e8c70 --- /dev/null +++ b/codemods/readme.md @@ -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'; +``` \ No newline at end of file diff --git a/codemods/src/v4/default-export/default-export.js b/codemods/src/v4/default-export/default-export.js new file mode 100644 index 0000000..ef8b163 --- /dev/null +++ b/codemods/src/v4/default-export/default-export.js @@ -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(); +}; diff --git a/package.json b/package.json index 8f3a829..d3b3868 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "repository": "pd4d10/vite-plugin-svgr", "files": [ "dist", - "client.d.ts" + "client.d.ts", + "codemods" ], "keywords": [ "vite",