// Update `plugin-rax-component` to `plugin-component`
// https://rax.js.org/docs/guide/com-migration
import * as fs from 'fs';
import * as path from 'path';
let demoOrder = 1;
// glob to reg: demo/*.{js,jsx,ts,tsx}
const DEMO_FILE_REG = /demo\/.*\.(js|jsx|ts|tsx)$/;
const changeFileExt = (file, ext) => {
return path.join(path.dirname(file), path.basename(file, path.extname(file)) + ext);
};
export default (fileInfo, api, options) => {
const j = api.jscodeshift;
const basename = path.basename(fileInfo.path);
if (basename === 'build.json') {
// {
// + "type": "rax",
// + "targets": ["web"],
// + "inlineStyle": true,
// "plugins": [
// - ["build-plugin-rax-component", {
// - "type": "rax",
// - "targets": ["web"],
// - "forceInline": true
// - }]
// + "build-plugin-component"
// ]
// }
let hasChanged = false;
let config = JSON.parse(fileInfo.source);
const pluginList = config.plugins || [];
for (let i = 0; i < pluginList.length; i++) {
if (pluginList[0][0] === 'build-plugin-rax-component') {
config = Object.assign({}, config, pluginList[0][1] || {});
if (config.forceInline !== undefined) {
config.inlineStyle = config.forceInline;
delete config.forceInline;
}
config.plugins.splice(i, 1, 'build-plugin-component');
hasChanged = true;
}
}
if (hasChanged) {
return JSON.stringify(config, null, ' ');
}
return null;
} else if (basename === 'package.json') {
// {
// - "build-plugin-rax-component": "^0.2.14",
// + "build-plugin-component": "^1.0.0"
// }
const config = JSON.parse(fileInfo.source);
const { devDependencies = {} } = config;
if (devDependencies['build-plugin-rax-component']) {
devDependencies['build-plugin-component'] = '^1.0.0';
delete devDependencies['build-plugin-rax-component'];
return JSON.stringify(config, null, ' ');
}
return null;
} else if (options.dry !== true && DEMO_FILE_REG.test(fileInfo.path)) {
// demo/xxx.jsx -> demo/xxx.md
// + ---
// + title: Baisc
// + order: 1
// + ---
// + ```jsx
// + import { createElement } from 'rax';
// - import { createElement, render } from 'rax';
// - import DriverUniversal from 'driver-universal';
// - import MyComponent from '../src/index';
// + import MyComponent from 'rax-example';
// - render(, document.body, { driver: DriverUniversal });
// + function App(){
// + return ;
// + }
// + export default App;
// + ```
const transform = j(fileInfo.source);
// render -> export function
transform.find(j.ExpressionStatement).forEach((p) => {
const { expression } = p.node;
if (expression.callee.name === 'render' && expression.arguments[0].type === 'JSXElement') {
const demoFnName = 'App';
const demoJSXElement = expression.arguments[0];
j(p).replaceWith(
j.functionDeclaration(j.identifier(demoFnName), [], j.blockStatement([j.returnStatement(demoJSXElement)])),
).insertAfter(
j.exportDeclaration(true, { type: 'Identifier', name: demoFnName }),
);
}
});
// process import
transform.find(j.ImportDeclaration).forEach((p) => {
const { node } = p;
// remove driver import like driver-universal
if (node.source.value.indexOf('driver-') > -1) {
j(p).remove();
}
});
// write xx.md file
fs.writeFileSync(changeFileExt(fileInfo.path, '.md'),
`${'---\n' +
'title: Baisc\n' +
`order: ${demoOrder++}\n` +
'---\n' +
'\n' +
`${fileInfo.path} usage\n` +
'```jsx\n'}${transform.toSource()
}\`\`\``
, 'utf8');
return fileInfo.source;
} else {
return fileInfo.source;
}
};