Add basic rename functionality

This commit is contained in:
Chris Bianca
2017-11-03 17:57:03 +00:00
parent 4bdb35629f
commit afa76a74f5
3 changed files with 421 additions and 12 deletions

165
bin/rename.js Normal file
View File

@@ -0,0 +1,165 @@
const fs = require('fs-extra');
const readline = require('readline');
const replace = require('replace-in-file');
const BASE_DIRECTORY = './';
const DEFAULT_COMPANY_NAME = 'invertase';
const DEFAULT_PACKAGE_NAME = 'com.invertase.rnfirebasestarter';
const DEFAULT_PROJECT_NAME = 'RNFirebaseStarter';
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const readInput = (input) => {
return new Promise((resolve, reject) => {
rl.question(`Enter your ${input}: `, (answer) => {
resolve(answer);
})
})
}
const replaceInFile = (from, to) => {
return new Promise((resolve, reject) => {
const options = {
files: [
'./android/**',
'./ios/**',
'./*',
],
from: new RegExp(from, 'g'),
to: to
};
replace(options)
.then(changedFiles => {
if (changedFiles) {
console.log('[replaceInFile] Modified files: \n', changedFiles.join('\n'));
}
resolve();
})
.catch(error => {
console.error('[replaceInFile] Error occurred: ', error);
reject(error);
})
})
}
const renameFiles = (dir, from, to) => {
const files = fs.readdirSync(dir);
for (let i = 0; i < files.length; i += 1) {
const filename = files[i];
const path = dir + '/' + filename;
const file = fs.statSync(path);
let newPath;
if (filename.indexOf(from) !== -1) {
newPath = dir + '/' + filename.replace(from, to);
fs.renameSync(path, newPath);
console.log(`[renameFiles] Renamed: ${path} to: ${newPath}`);
}
// Recursive
if (file.isDirectory()) {
renameFiles(newPath || path, from, to);
}
}
}
const updateProjectName = (name) => {
console.log('---------------------------------------');
console.log(`Updating project name: ${name}`);
console.log('---------------------------------------');
return replaceInFile(DEFAULT_PROJECT_NAME, name)
.then(() => {
console.log('---------------------------------------');
console.log('Finished updating project name');
console.log('---------------------------------------');
console.log();
});
}
const updatePackageName = (packageName) => {
console.log('---------------------------------------');
console.log(`Updating package name: ${packageName}`);
console.log('---------------------------------------');
return replaceInFile(DEFAULT_PACKAGE_NAME, packageName)
.then(() => {
console.log('---------------------------------------');
console.log('Finished updating package name');
console.log('---------------------------------------');
console.log();
});;
}
const renameProjectFiles = (name) => {
console.log('---------------------------------------');
console.log(`Rename project files`);
console.log('---------------------------------------');
return new Promise((resolve, reject) => {
renameFiles(BASE_DIRECTORY, DEFAULT_PROJECT_NAME, name);
console.log('---------------------------------------');
console.log('Finished renaming project files');
console.log('---------------------------------------');
console.log();
resolve();
})
}
const renameCompanyFiles = (name) => {
console.log('---------------------------------------');
console.log(`Rename company files`);
console.log('---------------------------------------');
return new Promise((resolve, reject) => {
renameFiles(BASE_DIRECTORY, DEFAULT_COMPANY_NAME, name);
console.log('---------------------------------------');
console.log('Finished renaming company files');
console.log('---------------------------------------');
console.log();
resolve();
})
}
const newCompanyName = 'magicalcompany';
const newProjectName = 'TestTemplate';
const newPackageName = 'com.magicalcompany.testtemplate';
const run = async () => {
console.log('------------------------------');
let projectName = await readInput('Project name, e.g. My Amazing Project');
if (!projectName || projectName === '') {
throw new Error('Please supply a valid project name');
}
console.log('------------------------------');
let companyName = await readInput('Company name, e.g. My Company');
if (!companyName || companyName === '') {
throw new Error('Please supply a valid company name');
}
console.log('------------------------------');
projectName = projectName.replace(/ /g, '');
companyName = companyName.replace(/ /g, '').toLowerCase();
const packageName = `com.${companyName}.${projectName.toLowerCase()}`;
// Close the input
rl.close();
console.log();
console.log('------------------------------');
console.log('Setting project parameters to:');
console.log('------------------------------');
console.log('Project name: ', projectName);
console.log('Company name: ', companyName);
console.log('Package name: ', packageName);
console.log('------------------------------');
console.log();
updateProjectName(projectName)
.then(() => updatePackageName(packageName))
.then(() => renameProjectFiles(projectName))
.then(() => renameCompanyFiles(companyName));
}
run().catch((error) => {
console.error(error.message);
process.exit();
});

264
package-lock.json generated
View File

@@ -1602,6 +1602,17 @@
"object-assign": "4.1.1"
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"dev": true,
"requires": {
"lru-cache": "4.1.1",
"shebang-command": "1.2.0",
"which": "1.3.0"
}
},
"cryptiles": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
@@ -1919,6 +1930,21 @@
"merge": "1.2.0"
}
},
"execa": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
"integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
"dev": true,
"requires": {
"cross-spawn": "5.1.0",
"get-stream": "3.0.0",
"is-stream": "1.1.0",
"npm-run-path": "2.0.2",
"p-finally": "1.0.0",
"signal-exit": "3.0.2",
"strip-eof": "1.0.0"
}
},
"expand-brackets": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
@@ -2173,13 +2199,14 @@
"integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8="
},
"fs-extra": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
"integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz",
"integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=",
"dev": true,
"requires": {
"graceful-fs": "4.1.11",
"jsonfile": "2.4.0",
"klaw": "1.3.1"
"jsonfile": "4.0.0",
"universalify": "0.1.1"
}
},
"fs.realpath": {
@@ -2989,6 +3016,12 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
"integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U="
},
"get-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
"dev": true
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -3869,6 +3902,18 @@
"babel-jest": "20.0.3",
"jest": "20.0.4",
"react-test-renderer": "16.0.0-alpha.12"
},
"dependencies": {
"react-test-renderer": {
"version": "16.0.0-alpha.12",
"resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0-alpha.12.tgz",
"integrity": "sha1-nkzF2M6L/KcneDQN4+FFS51sDMU=",
"dev": true,
"requires": {
"fbjs": "0.8.16",
"object-assign": "4.1.1"
}
}
}
},
"jest-jasmine2": {
@@ -4311,9 +4356,10 @@
"integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0="
},
"jsonfile": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "4.1.11"
}
@@ -4577,6 +4623,15 @@
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"mem": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
"integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
"dev": true,
"requires": {
"mimic-fn": "1.1.0"
}
},
"merge": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
@@ -4838,6 +4893,15 @@
"remove-trailing-separator": "1.1.0"
}
},
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
"integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
"dev": true,
"requires": {
"path-key": "2.0.1"
}
},
"npmlog": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz",
@@ -4982,6 +5046,12 @@
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
"dev": true
},
"p-limit": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz",
@@ -5046,6 +5116,12 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-key": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
"dev": true
},
"path-parse": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
@@ -5401,6 +5477,16 @@
}
}
},
"fs-extra": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
"integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
"requires": {
"graceful-fs": "4.1.11",
"jsonfile": "2.4.0",
"klaw": "1.3.1"
}
},
"jest-docblock": {
"version": "20.1.0-echo.1",
"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.1.0-echo.1.tgz",
@@ -5419,6 +5505,14 @@
"worker-farm": "1.5.0"
}
},
"jsonfile": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
"requires": {
"graceful-fs": "4.1.11"
}
},
"metro-bundler": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/metro-bundler/-/metro-bundler-0.13.0.tgz",
@@ -5509,9 +5603,9 @@
}
},
"react-test-renderer": {
"version": "16.0.0-alpha.12",
"resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0-alpha.12.tgz",
"integrity": "sha1-nkzF2M6L/KcneDQN4+FFS51sDMU=",
"version": "16.0.0-beta.5",
"resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0-beta.5.tgz",
"integrity": "sha512-cTgpGjbew12c6MZqTe4qjWE91GxRrl9nRHYJKLayPSu10E4ZeMr/xOVy4fkY78dKwgSJVu/6oYIoN84leh81XA==",
"dev": true,
"requires": {
"fbjs": "0.8.16",
@@ -5651,6 +5745,142 @@
"resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
"integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ="
},
"replace-in-file": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-3.0.0.tgz",
"integrity": "sha512-/0oRts4OCzjA3AkUB/jy4RiH8AeWVkvjh75PIRaNFRl2I+OLl4GCxH07TYhZG7gjffTy44kRJftuiIRCxBeQQw==",
"dev": true,
"requires": {
"chalk": "2.3.0",
"glob": "7.1.2",
"yargs": "10.0.3"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
"integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
"dev": true,
"requires": {
"color-convert": "1.9.0"
}
},
"camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
"dev": true
},
"chalk": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
"integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
"dev": true,
"requires": {
"ansi-styles": "3.2.0",
"escape-string-regexp": "1.0.5",
"supports-color": "4.5.0"
}
},
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
"string-width": "1.0.2",
"strip-ansi": "3.0.1",
"wrap-ansi": "2.1.0"
},
"dependencies": {
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
"strip-ansi": "3.0.1"
}
}
}
},
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"dev": true,
"requires": {
"locate-path": "2.0.0"
}
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "1.0.1"
}
},
"os-locale": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
"integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
"dev": true,
"requires": {
"execa": "0.7.0",
"lcid": "1.0.0",
"mem": "1.1.0"
}
},
"supports-color": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
"integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
"dev": true,
"requires": {
"has-flag": "2.0.0"
}
},
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"yargs": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-10.0.3.tgz",
"integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==",
"dev": true,
"requires": {
"cliui": "3.2.0",
"decamelize": "1.2.0",
"find-up": "2.1.0",
"get-caller-file": "1.0.2",
"os-locale": "2.1.0",
"require-directory": "2.1.1",
"require-main-filename": "1.0.1",
"set-blocking": "2.0.0",
"string-width": "2.1.1",
"which-module": "2.0.0",
"y18n": "3.2.1",
"yargs-parser": "8.0.0"
}
},
"yargs-parser": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.0.0.tgz",
"integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=",
"dev": true,
"requires": {
"camelcase": "4.1.0"
}
}
}
},
"request": {
"version": "2.83.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
@@ -6162,6 +6392,12 @@
"is-utf8": "0.2.1"
}
},
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
"dev": true
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -6367,6 +6603,12 @@
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz",
"integrity": "sha1-sHoualQagV/Go0zNRTO67DB8qGQ="
},
"universalify": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
"integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
"dev": true
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",

View File

@@ -4,8 +4,10 @@
"private": true,
"devDependencies": {
"babel-preset-react-native-stage-0": "^1.0.1",
"fs-extra": "^4.0.2",
"jest-expo": "^21.0.2",
"react-test-renderer": "16.0.0-beta.5"
"react-test-renderer": "16.0.0-beta.5",
"replace-in-file": "^3.0.0"
},
"scripts": {
"start": "react-native start",