From afa76a74f5eaaff05341d79ab32520069f508c88 Mon Sep 17 00:00:00 2001 From: Chris Bianca Date: Fri, 3 Nov 2017 17:57:03 +0000 Subject: [PATCH] Add basic rename functionality --- bin/rename.js | 165 +++++++++++++++++++++++++++++ package-lock.json | 264 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 4 +- 3 files changed, 421 insertions(+), 12 deletions(-) create mode 100644 bin/rename.js diff --git a/bin/rename.js b/bin/rename.js new file mode 100644 index 0000000..e4aa4be --- /dev/null +++ b/bin/rename.js @@ -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(); +}); diff --git a/package-lock.json b/package-lock.json index 3aaabea..3c34906 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 30ef22b..dfbc660 100644 --- a/package.json +++ b/package.json @@ -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",