1 | const { isAngular } = require("./projectHelpers");
|
2 |
|
3 | const NEW_DEPS_MESSAGE = `\
|
4 | A few new dependencies were added. \
|
5 | Run "npm install" before building your project.
|
6 | `;
|
7 |
|
8 | const ALREADY_ADDED_MESSAGE = `\
|
9 | Some dependencies have already been added. \
|
10 | If you want to force update them, please run "node_modules/.bin/update-ns-webpack".
|
11 | `;
|
12 |
|
13 | const USAGE_MESSAGE = `
|
14 | NativeScript Webpack plugin was successfully added.
|
15 | You can now bundle your project by passing --bundle flag to NativeScript CLI commands:
|
16 | - tns build android --bundle
|
17 | - tns build ios --bundle
|
18 | - tns run android --bundle
|
19 | - tns run ios --bundle
|
20 | You can also pass the "--env.uglify" flag to use UglifyJS for minification.
|
21 | For more information check out https://docs.nativescript.org/tooling/bundling-with-webpack#bundling.
|
22 | `;
|
23 |
|
24 | function addProjectDeps(packageJson, force = false) {
|
25 | packageJson.devDependencies = packageJson.devDependencies || {};
|
26 | const postinstallOptions = {
|
27 | deps: Object.assign({}, packageJson.devDependencies),
|
28 | };
|
29 |
|
30 | const depsToAdd = getRequiredDeps(packageJson);
|
31 | Object.keys(depsToAdd).forEach(function(name) {
|
32 | const version = depsToAdd[name];
|
33 | Object.assign(postinstallOptions,
|
34 | addDependency(postinstallOptions.deps, name, version, force));
|
35 | });
|
36 |
|
37 | return postinstallOptions;
|
38 | }
|
39 |
|
40 | function forceUpdateProjectDeps(packageJson) {
|
41 | removeObsoleteDeps(packageJson);
|
42 |
|
43 | return addProjectDeps(packageJson, true);
|
44 | }
|
45 |
|
46 | function removeObsoleteDeps(packageJson) {
|
47 | const depsToRemove = [
|
48 | "webpack",
|
49 | "webpack-cli",
|
50 | "webpack-bundle-analyzer",
|
51 | "webpack-sources",
|
52 | "clean-webpack-plugin",
|
53 | "copy-webpack-plugin",
|
54 | "raw-loader",
|
55 | "css-loader",
|
56 | "nativescript-worker-loader",
|
57 | "uglifyjs-webpack-plugin",
|
58 | "@angular-devkit/core",
|
59 | "resolve-url-loader",
|
60 | "sass-loader",
|
61 | ];
|
62 |
|
63 | depsToRemove.forEach(dep => delete packageJson.devDependencies[dep]);
|
64 | }
|
65 |
|
66 | function addDependency(deps, name, version, force) {
|
67 | const options = { deps };
|
68 |
|
69 | if (!deps[name] || force) {
|
70 | deps[name] = version;
|
71 | options.newDepsAdded = true;
|
72 | console.info(`Adding dev dependency: ${name}@${version}`);
|
73 | } else if (deps[name] !== version) {
|
74 | options.hasOldDeps = true;
|
75 | console.info(`Dev dependency: ${name} already added. Leaving version: ${deps[name]}`);
|
76 | }
|
77 |
|
78 | return options;
|
79 | }
|
80 |
|
81 | function getRequiredDeps(packageJson) {
|
82 | if (!isAngular({packageJson})) {
|
83 | return false;
|
84 | }
|
85 |
|
86 | const deps = {
|
87 | "@angular/compiler-cli": "~7.1.0",
|
88 | };
|
89 |
|
90 | if (!dependsOn(packageJson, "@angular-devkit/build-angular")) {
|
91 | deps["@ngtools/webpack"] = "~7.1.0";
|
92 | }
|
93 |
|
94 | return deps;
|
95 | }
|
96 |
|
97 |
|
98 | function dependsOn(packageJson, package) {
|
99 | if (!packageJson) {
|
100 | return false;
|
101 | }
|
102 |
|
103 | return packageJson.dependencies.hasOwnProperty(package) ||
|
104 | packageJson.devDependencies.hasOwnProperty(package);
|
105 | }
|
106 |
|
107 | function showHelperMessages({ newDepsAdded, hasOldDeps }) {
|
108 | console.info(USAGE_MESSAGE);
|
109 |
|
110 | if (hasOldDeps) {
|
111 | console.info(ALREADY_ADDED_MESSAGE);
|
112 | }
|
113 |
|
114 | if (newDepsAdded) {
|
115 | console.info(NEW_DEPS_MESSAGE);
|
116 | }
|
117 | }
|
118 |
|
119 | module.exports = {
|
120 | addProjectDeps,
|
121 | forceUpdateProjectDeps,
|
122 | showHelperMessages,
|
123 | };
|