Skip to content

Commit 01d7fd7

Browse files
author
Sebastian McKenzie
committed
add --save-tilde flag, add support for multiple save flags - fixes #113
1 parent 68bbec9 commit 01d7fd7

File tree

1 file changed

+30
-18
lines changed

1 file changed

+30
-18
lines changed

src/cli/commands/install.js

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { stringify } from "../../util/misc.js";
2828
import map from "../../util/map.js";
2929

3030
let invariant = require("invariant");
31+
let semver = require("semver");
3132
let emoji = require("node-emoji");
3233
let path = require("path");
3334

@@ -191,8 +192,8 @@ export class Install {
191192
async savePackages(): Promise<void> {
192193
if (!this.args.length) return;
193194

194-
let { save, saveDev, saveExact, saveOptional } = this.flags;
195-
if (!save && !saveDev && !saveOptional) return;
195+
let { save, saveDev, saveExact, saveTilde, saveOptional, savePeer } = this.flags;
196+
if (!save && !saveDev && !saveOptional && !savePeer) return;
196197

197198
let json = {};
198199
let jsonLoc = path.join(this.config.cwd, "package.json");
@@ -211,22 +212,30 @@ export class Install {
211212

212213
let parts = PackageRequest.normalisePattern(pattern);
213214
let version;
214-
if (!saveExact) {
215-
version = `^${pkg.version}`;
216-
} else {
215+
if (parts.range && !semver.validRange(parts.range)) {
216+
// if a range was specified in this pattern and it's not a semver range then
217+
// it's exotic and can't be found on the npm registry
217218
version = parts.range;
219+
} else if (saveTilde) { // --save-tilde
220+
version = `~${pkg.version}`;
221+
} else if (saveExact) { // --save-exact
222+
version = pkg.version;
223+
} else { // default to caret
224+
version = `^${pkg.version}`;
218225
}
219226

220-
221-
let targetKey;
222-
if (save) targetKey = "dependencies";
223-
if (saveDev) targetKey = "devDependencies";
224-
if (saveOptional) targetKey = "optionalDependencies";
225-
if (!targetKey) continue;
227+
let targetKeys = [];
228+
if (save) targetKeys.push("dependencies");
229+
if (saveDev) targetKeys.push("devDependencies");
230+
if (savePeer) targetKeys.push("peerDependencies");
231+
if (saveOptional) targetKeys.push("optionalDependencies");
232+
if (!targetKeys.length) continue;
226233

227234
// add it to package.json
228-
let target = json[targetKey] = json[targetKey] || {};
229-
target[pkg.name] = version;
235+
for (let key of targetKeys) {
236+
let target = json[key] = json[key] || {};
237+
target[pkg.name] = version;
238+
}
230239

231240
// add pattern so it's aliased in the lockfile
232241
let newPattern = `${pkg.name}@${version}`;
@@ -319,7 +328,8 @@ export class Install {
319328
*/
320329

321330
function hasSaveFlags(flags: Object): boolean {
322-
return flags.save || flags.saveDev || flags.saveExact || flags.saveOptional;
331+
return flags.save || flags.saveExact || flags.saveTilde ||
332+
flags.saveDev || flags.saveExact || flags.savePeer;
323333
}
324334

325335
/**
@@ -375,10 +385,12 @@ export function setFlags(commander: Object) {
375385
commander.usage("install [packages ...] [flags]");
376386
commander.option("-f, --flat", "only allow one version of a package. save all transitive " +
377387
"dependencies as top level.");
378-
commander.option("-S, --save", "save package to your `dependencies`"); // TODO
379-
commander.option("-D, --save-dev", "save package to your `devDependencies`"); // TODO
380-
commander.option("-O, --save-optional", "save package to your `optionalDependencies`"); // TODO
381-
commander.option("-E, --save-exact", ""); // TODO
388+
commander.option("-S, --save", "save package to your `dependencies`");
389+
commander.option("-D, --save-dev", "save package to your `devDependencies`");
390+
commander.option("-P, --save-peer", "save package to your `peerDependencies`");
391+
commander.option("-O, --save-optional", "save package to your `optionalDependencies`");
392+
commander.option("-E, --save-exact", "");
393+
commander.option("-T, --save-tilde", "");
382394
commander.option("--tag [tag]", ""); // TODO
383395
commander.option("--dry-run", ""); // TODO
384396
commander.option("-f, --force", ""); // TODO

0 commit comments

Comments
 (0)