From 30ba5d79776dedfb8c8d1f211e21fee555e4142f Mon Sep 17 00:00:00 2001 From: sis0k0 Date: Thu, 19 Oct 2017 14:54:16 +0300 Subject: [PATCH 1/2] refactor(update-ns-webpack): provide multiple options for updating the plugin --- bin/update-ns-webpack | 25 ++++------ installer.js | 9 ++-- npmScriptsManager.js | 8 ++++ projectFilesManager.js | 7 +++ verify/update.js | 106 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 20 deletions(-) create mode 100644 verify/update.js diff --git a/bin/update-ns-webpack b/bin/update-ns-webpack index 57c8427b..fa75fd28 100755 --- a/bin/update-ns-webpack +++ b/bin/update-ns-webpack @@ -1,21 +1,12 @@ #!/usr/bin/env node -const { resolve } = require("path"); -const { getPackageJson, getProjectDir, writePackageJson } = require("../projectHelpers"); -const { forceUpdateProjectDeps } = require("../dependencyManager"); -const { editExistingProjectFiles } = require("../projectFilesManager"); +const update = require("../verify/update"); -const PROJECT_DIR = getProjectDir({ nestingLvl: 2 }); -const packageJson = getPackageJson(PROJECT_DIR); - -console.info("Updating dev dependencies..."); - -const { deps } = forceUpdateProjectDeps(packageJson); -packageJson.devDependencies = deps; -writePackageJson(packageJson, PROJECT_DIR); - -console.info("\nUpdating configuration files..."); -editExistingProjectFiles(PROJECT_DIR); - -console.info("\nProject successfully updated! Don't forget to run `npm install`"); +const options = { + pluginVersion: process.env.npm_config_plugin_version, + deps: process.env.npm_config_deps, + scripts: process.env.npm_config_scripts, + configs: process.env.npm_config_configs, +} +update(options); diff --git a/installer.js b/installer.js index 1dc53159..d77bb747 100644 --- a/installer.js +++ b/installer.js @@ -32,9 +32,12 @@ function uninstall() { projectFilesManager.removeProjectFiles(PROJECT_DIR, APP_DIR); - console.log("Removing npm scripts..."); - npmScriptsManager.removeDeprecatedNpmScripts(packageJson); - npmScriptsManager.removeNpmScripts(packageJson.scripts); + const scripts = packageJson.scripts; + if (scripts) { + console.log("Removing npm scripts..."); + npmScriptsManager.removeDeprecatedNpmScripts(scripts); + npmScriptsManager.removeNpmScripts(scripts); + } helpers.writePackageJson(packageJson, PROJECT_DIR); diff --git a/npmScriptsManager.js b/npmScriptsManager.js index 8dc61afc..588da843 100644 --- a/npmScriptsManager.js +++ b/npmScriptsManager.js @@ -51,8 +51,16 @@ function removePlatformScripts(scripts, nameTemplate) { }); } +function forceUpdateNpmScripts(scripts) { + removeDeprecatedNpmScripts(scripts); + removeNpmScripts(scripts); + + addNpmScripts(scripts); +} + module.exports = { addNpmScripts, removeDeprecatedNpmScripts, removeNpmScripts, + forceUpdateNpmScripts, }; diff --git a/projectFilesManager.js b/projectFilesManager.js index 6eba5170..f11e31b9 100644 --- a/projectFilesManager.js +++ b/projectFilesManager.js @@ -59,6 +59,11 @@ function removeProjectFiles(projectDir, appDir) { }); } +function forceUpdateProjectFiles(projectDir, appDir) { + removeProjectFiles(projectDir, appDir); + addProjectFiles(projectDir, appDir); +} + function deleteFile(destinationPath) { if (fs.existsSync(destinationPath)) { console.info(`Deleting file: ${destinationPath}`); @@ -189,5 +194,7 @@ function tsOrJs(projectDir, name) { module.exports = { addProjectFiles, removeProjectFiles, + forceUpdateProjectFiles, editExistingProjectFiles, }; + diff --git a/verify/update.js b/verify/update.js new file mode 100644 index 00000000..9281c552 --- /dev/null +++ b/verify/update.js @@ -0,0 +1,106 @@ +const { spawn } = require("child_process"); +const { resolve: pathResolve } = require("path"); + +const { getPackageJson, getProjectDir, writePackageJson } = require("../projectHelpers"); +const { forceUpdateProjectFiles } = require("../projectFilesManager"); +const { forceUpdateProjectDeps } = require("../dependencyManager"); +const { forceUpdateNpmScripts } = require("../npmScriptsManager"); + +const PLUGIN_NAME = "nativescript-dev-webpack"; +const PROJECT_DIR = getProjectDir({ nestingLvl: 2 }); + +function update({ + deps: shouldUpdateDeps, + scripts: shouldUpdateScripts, + configs: shouldUpdateConfigs, + projectDir = PROJECT_DIR +} = {}) { + + const commands = []; + + if (shouldUpdateDeps) { + commands.push(() => updateDeps(projectDir)); + } + + if (shouldUpdateScripts) { + commands.push(() => Promise.resolve(updateScripts(projectDir))); + } + + if (shouldUpdateConfigs) { + commands.push(() => Promise.resolve(updateConfigs(projectDir))); + } + + return commands.reduce((current, next) => current.then(next), Promise.resolve()); +} + +function updateScripts(projectDir) { + console.info("Updating npm scripts..."); + + const packageJson = getPackageJson(projectDir); + const scripts = packageJson.scripts || {}; + + forceUpdateNpmScripts(scripts); + packageJson.scripts = scripts; + writePackageJson(packageJson, projectDir); +} + +function updateDeps(projectDir) { + console.info("Updating dev dependencies..."); + + return new Promise((resolve, reject) => { + const packageJson = getPackageJson(projectDir); + const { deps } = forceUpdateProjectDeps(packageJson); + packageJson.devDependencies = deps; + writePackageJson(packageJson, projectDir); + + const command = `npm install --ignore-scripts`; + execute(command).then(resolve).catch(reject); + }); +} + +function updateConfigs(projectDir) { + console.info("Updating configuration files..."); + + const appDir = pathResolve(projectDir, "app"); + forceUpdateProjectFiles(projectDir, appDir); +} + +function execute(command) { + return new Promise((resolve, reject) => { + const args = command.split(" "); + spawnChildProcess(...args) + .then(resolve) + .catch(throwError) + }); +} + +function spawnChildProcess(command, ...args) { + return new Promise((resolve, reject) => { + const escapedArgs = args.map(a => `"${a}"`); + + const childProcess = spawn(command, escapedArgs, { + stdio: "inherit", + pwd: PROJECT_DIR, + shell: true, + }); + + childProcess.on("close", code => { + if (code === 0) { + resolve(); + } else { + reject({ + code, + message: `child process exited with code ${code}`, + }); + } + }); + }); +} + +function throwError(error) { + console.error(error.message); + process.exit(error.code || 1); +} + +module.exports = update; + From 2f6d590fdfb82b7aa7fee67409e00484fb2c245a Mon Sep 17 00:00:00 2001 From: sis0k0 Date: Tue, 31 Oct 2017 18:34:06 +0200 Subject: [PATCH 2/2] fix: consider process args when using update script --- bin/update-ns-webpack | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/bin/update-ns-webpack b/bin/update-ns-webpack index fa75fd28..84611250 100755 --- a/bin/update-ns-webpack +++ b/bin/update-ns-webpack @@ -2,11 +2,19 @@ const update = require("../verify/update"); -const options = { - pluginVersion: process.env.npm_config_plugin_version, - deps: process.env.npm_config_deps, - scripts: process.env.npm_config_scripts, - configs: process.env.npm_config_configs, +const { original: npmArgs = [] } = JSON.parse(process.env.npm_config_argv || {}); +const [, , ...processArgs ] = process.argv; + +const flags = [ ...npmArgs, ...processArgs ] + .filter(f => f.startsWith("--")) + .map(f => f.substring(2)); + +function addOption(all, current) { + all[current] = true; + return all; } +const options = flags.reduce(addOption, {}); + update(options); +