tix-react-ssr
Version:
Tiket.com React Project Scripts
96 lines (86 loc) • 2.4 kB
JavaScript
const mkdirp = require('mkdirp'),
createJestFile = require('./createJestTest'),
fs = require('fs');
const generateFile = (filePath, filename, originalFile, startPath) => {
return new Promise((resolve, reject) => {
checkIfReactFile(filePath)
.then(({ isReactFile, filePath }) => {
if (isReactFile) {
const testPath = `${startPath}/__tests__`;
const testFileName = `${filename.replace(/\.[^/.]+$/, '')}.spec.jsx`;
const fileContent = createJestFile.createJestTest(filename, originalFile);
resolve(
findTestFolder(testPath).then(() =>
createTestFile(`${testPath}/${testFileName}`, fileContent)
)
);
} else {
resolve(0);
}
})
.catch(reject);
});
};
function createTestFile(filename, content) {
return new Promise((resolve, reject) => {
fs.open(filename, 'r', function(err, fd) {
if (err) {
fs.writeFile(filename, content, function(err) {
if (err) {
reject(err);
} else {
resolve(1);
}
});
} else {
console.log('The file exists!', filename);
resolve(0);
}
});
});
}
function findTestFolder(path) {
return new Promise((resolve, reject) => {
mkdirp(path, function(err) {
if (err) {
reject(err);
} else {
// console.log(`created test folder: ${path}`);
resolve();
}
});
});
}
function checkIfReactFile(filePath) {
if (filePath.indexOf('.spec.js') > 0 ||
filePath.indexOf('App.js') > 0 ||
filePath.indexOf('AppServer.js') > 0 ||
filePath.indexOf('client.js') > 0 ||
filePath.indexOf('server.js') > 0) {
// Don't generate files for test files
return Promise.resolve(false);
}
return new Promise((resolve, reject) => {
fs.readFile(filePath, function(err1, data) {
if (err1) {
console.error(err1);
reject();
} else {
const res = {
filePath,
isReactFile: isReactFile(data)
};
resolve(res);
}
});
});
}
function isReactFile(data) {
// naive way of trying to check if the file is a React comp
if (data.indexOf(`require('react')`) >= 0 || data.indexOf(`from 'react'`) >= 0) {
return true;
} else {
return false;
}
}
module.exports = { generateFile };