@monteway/codeshift v0.4.2
@monteway/codeshift
Internal jscodeshift helpers used in @monteway/app for easier codemod implementation.
Install
npm i -D @monteway/codeshiftUsage
appendImports
Adds new import inside imports group. You can specify where the import should go, by selecting an existing import inside source file and set if the new one should go before of after it.
Let's have
index.tsxfile with following content:import ReactDOM from 'react-dom'; // some more content that is irrelevantNow write a codemod file
codeshift.mjsthat will be run using jscodeshift. \ In this example we want to add a React default import beforereact-domimport.import { appendImports } from '@monteway/codeshift'; export default function codemod(file, api, options) { const jscodeshift = api.jscodeshift; let source = jscodeshift(file.source); source = appendImports( jscodeshift, source, 'BEFORE_FIRST', /^react-dom$/, `import React from 'react';`, ); return source.toSource(); }The output of running
codeshift.mjsforindex.tsxcontent would be:+ import React from 'react'; import ReactDOM from 'react-dom'; // some more content that is irrelevant
wrapDefaultExport
Finds a default export and wraps it with a call experssion.
Let's have a
index.tsxfile with the following content:import React from 'react'; function Component() { return <>Hello, world!</>; } export default Component;Now write a codemod file
codeshift.mjsthat will be run using jscodeshift. \ In this example we want to wrap theComponentwithmemo.import { wrapDefaultExport } from '@monteway/codeshift'; export default function codemod(file, api, options) { const jscodeshift = api.jscodeshift; let source = jscodeshift(file.source); source = wrapDefaultExport(jscodeshift, source, 'memo'); return source.toSource(); }The output of running
codeshift.mjsforindex.tsxcontent would be:import React from 'react'; function Component() { return <>Hello, world!</>; } - export default Component; + export default memo(Component);Notice that for this code to run we would need to add import for
memo. We could solve it by usingReact.memoinstead ofmemo, sinceReactis already imported, but right now, thewrapDefaultExportdoes not accept anything other than identifier node, so we could not useReact.memo, since this a member experssion, not an identifier.
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago