Skip to content
This repository was archived by the owner on Aug 7, 2021. It is now read-only.

Commit 323f638

Browse files
authored
refactor(update-ns-webpack): provide multiple options for updating the plugin (#297)
- update dependencies (--deps) - update npm scripts (--scripts) - update webpack configuration files (--configs)
1 parent 66d77c1 commit 323f638

File tree

5 files changed

+134
-24
lines changed

5 files changed

+134
-24
lines changed

bin/update-ns-webpack

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,13 @@
11
#!/usr/bin/env node
2-
const { resolve } = require("path");
32

4-
const { getPackageJson, getProjectDir, writePackageJson } = require("../projectHelpers");
5-
const { addProjectFiles, removeProjectFiles } = require("../projectFilesManager");
6-
const { forceUpdateProjectDeps } = require("../dependencyManager");
7-
const { editExistingProjectFiles } = require("../projectFilesManager");
3+
const update = require("../verify/update");
84

9-
const PROJECT_DIR = getProjectDir({ nestingLvl: 2 });
10-
const APP_DIR = resolve(PROJECT_DIR, "app");
11-
const packageJson = getPackageJson(PROJECT_DIR);
12-
13-
console.info("Updating dev dependencies...");
14-
const { deps } = forceUpdateProjectDeps(packageJson);
15-
packageJson.devDependencies = deps;
16-
writePackageJson(packageJson, PROJECT_DIR);
17-
18-
console.info("\nUpdating configuration files...");
19-
if (process.env.npm_config_force) {
20-
removeProjectFiles(PROJECT_DIR, APP_DIR);
21-
addProjectFiles(PROJECT_DIR, APP_DIR);
22-
} else {
23-
editExistingProjectFiles(PROJECT_DIR);
5+
const options = {
6+
pluginVersion: process.env.npm_config_plugin_version,
7+
deps: process.env.npm_config_deps,
8+
scripts: process.env.npm_config_scripts,
9+
configs: process.env.npm_config_configs,
2410
}
2511

26-
console.info("\nProject successfully updated! Don't forget to run `npm install`");
12+
update(options);
2713

installer.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ function uninstall() {
3232

3333
projectFilesManager.removeProjectFiles(PROJECT_DIR, APP_DIR);
3434

35-
console.log("Removing npm scripts...");
36-
npmScriptsManager.removeDeprecatedNpmScripts(packageJson);
37-
npmScriptsManager.removeNpmScripts(packageJson.scripts);
35+
const scripts = packageJson.scripts;
36+
if (scripts) {
37+
console.log("Removing npm scripts...");
38+
npmScriptsManager.removeDeprecatedNpmScripts(scripts);
39+
npmScriptsManager.removeNpmScripts(scripts);
40+
}
3841

3942
helpers.writePackageJson(packageJson, PROJECT_DIR);
4043

npmScriptsManager.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,16 @@ function removePlatformScripts(scripts, nameTemplate) {
5353
});
5454
}
5555

56+
function forceUpdateNpmScripts(scripts) {
57+
removeDeprecatedNpmScripts(scripts);
58+
removeNpmScripts(scripts);
59+
60+
addNpmScripts(scripts);
61+
}
62+
5663
module.exports = {
5764
addNpmScripts,
5865
removeDeprecatedNpmScripts,
5966
removeNpmScripts,
67+
forceUpdateNpmScripts,
6068
};

projectFilesManager.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ function removeProjectFiles(projectDir, appDir) {
5959
});
6060
}
6161

62+
function forceUpdateProjectFiles(projectDir, appDir) {
63+
removeProjectFiles(projectDir, appDir);
64+
addProjectFiles(projectDir, appDir);
65+
}
66+
6267
function deleteFile(destinationPath) {
6368
if (fs.existsSync(destinationPath)) {
6469
console.info(`Deleting file: ${destinationPath}`);
@@ -189,5 +194,7 @@ function tsOrJs(projectDir, name) {
189194
module.exports = {
190195
addProjectFiles,
191196
removeProjectFiles,
197+
forceUpdateProjectFiles,
192198
editExistingProjectFiles,
193199
};
200+

verify/update.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
const { spawn } = require("child_process");
2+
const { resolve: pathResolve } = require("path");
3+
4+
const { getPackageJson, getProjectDir, writePackageJson } = require("../projectHelpers");
5+
const { forceUpdateProjectFiles } = require("../projectFilesManager");
6+
const { forceUpdateProjectDeps } = require("../dependencyManager");
7+
const { forceUpdateNpmScripts } = require("../npmScriptsManager");
8+
9+
const PLUGIN_NAME = "nativescript-dev-webpack";
10+
const PROJECT_DIR = getProjectDir({ nestingLvl: 2 });
11+
12+
function update({
13+
deps: shouldUpdateDeps,
14+
scripts: shouldUpdateScripts,
15+
configs: shouldUpdateConfigs,
16+
projectDir = PROJECT_DIR
17+
} = {}) {
18+
19+
const commands = [];
20+
21+
if (shouldUpdateDeps) {
22+
commands.push(() => updateDeps(projectDir));
23+
}
24+
25+
if (shouldUpdateScripts) {
26+
commands.push(() => Promise.resolve(updateScripts(projectDir)));
27+
}
28+
29+
if (shouldUpdateConfigs) {
30+
commands.push(() => Promise.resolve(updateConfigs(projectDir)));
31+
}
32+
33+
return commands.reduce((current, next) => current.then(next), Promise.resolve());
34+
}
35+
36+
function updateScripts(projectDir) {
37+
console.info("Updating npm scripts...");
38+
39+
const packageJson = getPackageJson(projectDir);
40+
const scripts = packageJson.scripts || {};
41+
42+
forceUpdateNpmScripts(scripts);
43+
packageJson.scripts = scripts;
44+
writePackageJson(packageJson, projectDir);
45+
}
46+
47+
function updateDeps(projectDir) {
48+
console.info("Updating dev dependencies...");
49+
50+
return new Promise((resolve, reject) => {
51+
const packageJson = getPackageJson(projectDir);
52+
const { deps } = forceUpdateProjectDeps(packageJson);
53+
packageJson.devDependencies = deps;
54+
writePackageJson(packageJson, projectDir);
55+
56+
const command = `npm install --ignore-scripts`;
57+
execute(command).then(resolve).catch(reject);
58+
});
59+
}
60+
61+
function updateConfigs(projectDir) {
62+
console.info("Updating configuration files...");
63+
64+
const appDir = pathResolve(projectDir, "app");
65+
forceUpdateProjectFiles(projectDir, appDir);
66+
}
67+
68+
function execute(command) {
69+
return new Promise((resolve, reject) => {
70+
const args = command.split(" ");
71+
spawnChildProcess(...args)
72+
.then(resolve)
73+
.catch(throwError)
74+
});
75+
}
76+
77+
function spawnChildProcess(command, ...args) {
78+
return new Promise((resolve, reject) => {
79+
const escapedArgs = args.map(a => `"${a}"`);
80+
81+
const childProcess = spawn(command, escapedArgs, {
82+
stdio: "inherit",
83+
pwd: PROJECT_DIR,
84+
shell: true,
85+
});
86+
87+
childProcess.on("close", code => {
88+
if (code === 0) {
89+
resolve();
90+
} else {
91+
reject({
92+
code,
93+
message: `child process exited with code ${code}`,
94+
});
95+
}
96+
});
97+
});
98+
}
99+
100+
function throwError(error) {
101+
console.error(error.message);
102+
process.exit(error.code || 1);
103+
}
104+
105+
module.exports = update;
106+

0 commit comments

Comments
 (0)