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

Commit 0ee667d

Browse files
sis0k0Vasil Chimev
authored and
Vasil Chimev
committed
refactor(update-ns-webpack): provide multiple options for updating the plugin (#308)
* refactor(update-ns-webpack): provide multiple options for updating the plugin * fix: consider process args when using update script
1 parent 7deb117 commit 0ee667d

File tree

5 files changed

+139
-16
lines changed

5 files changed

+139
-16
lines changed

Diff for: bin/update-ns-webpack

+12-13
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
#!/usr/bin/env node
2-
const { resolve } = require("path");
32

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

8-
const PROJECT_DIR = getProjectDir({ nestingLvl: 2 });
9-
const packageJson = getPackageJson(PROJECT_DIR);
5+
const { original: npmArgs = [] } = JSON.parse(process.env.npm_config_argv || {});
6+
const [, , ...processArgs ] = process.argv;
107

11-
console.info("Updating dev dependencies...");
8+
const flags = [ ...npmArgs, ...processArgs ]
9+
.filter(f => f.startsWith("--"))
10+
.map(f => f.substring(2));
1211

13-
const { deps } = forceUpdateProjectDeps(packageJson);
14-
packageJson.devDependencies = deps;
15-
writePackageJson(packageJson, PROJECT_DIR);
12+
function addOption(all, current) {
13+
all[current] = true;
14+
return all;
15+
}
1616

17-
console.info("\nUpdating configuration files...");
18-
editExistingProjectFiles(PROJECT_DIR);
17+
const options = flags.reduce(addOption, {});
1918

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

Diff for: installer.js

+6-3
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

Diff for: npmScriptsManager.js

+8
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,16 @@ function removePlatformScripts(scripts, nameTemplate) {
5151
});
5252
}
5353

54+
function forceUpdateNpmScripts(scripts) {
55+
removeDeprecatedNpmScripts(scripts);
56+
removeNpmScripts(scripts);
57+
58+
addNpmScripts(scripts);
59+
}
60+
5461
module.exports = {
5562
addNpmScripts,
5663
removeDeprecatedNpmScripts,
5764
removeNpmScripts,
65+
forceUpdateNpmScripts,
5866
};

Diff for: projectFilesManager.js

+7
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+

Diff for: verify/update.js

+106
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)