Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prefer local install #572

Merged
merged 5 commits into from Oct 29, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -42,6 +42,7 @@
"github-url-from-git": "^1.5.0",
"has-yarn": "^2.1.0",
"hosted-git-info": "^3.0.0",
"import-local": "^3.0.2",
"inquirer": "^7.0.0",
"is-installed-globally": "^0.3.1",
"is-scoped": "^2.1.0",
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Expand Up @@ -80,7 +80,7 @@ Run `np` without arguments to launch the interactive UI that guides you through

## Config

`np` can be configured both locally and globally. When using the global `np` binary, you can configure any of the CLI flags in either a `.np-config.js` or `.np-config.json` file in the home directory. When using the local `np` binary, for example, in a `npm run` script, you can configure `np` by setting the flags in either a top-level `np` field in `package.json` or in a `.np-config.js` or `.np-config.json` file in the project directory.
`np` can be configured both locally and globally. When using the global `np` binary, you can configure any of the CLI flags in either a `.np-config.js` or `.np-config.json` file in the home directory. When using the local `np` binary, for example, in a `npm run` script, you can configure `np` by setting the flags in either a top-level `np` field in `package.json` or in a `.np-config.js` or `.np-config.json` file in the project directory. If it exists, the local installation will always take precedence. This ensures any local config matches the version of `np` it was designed for.

Currently, these are the flags you can configure:

Expand Down
147 changes: 147 additions & 0 deletions source/cli-implementation.js
@@ -0,0 +1,147 @@
#!/usr/bin/env node
'use strict';
// eslint-disable-next-line import/no-unassigned-import
require('symbol-observable'); // Important: This needs to be first to prevent weird Observable incompatibilities
const logSymbols = require('log-symbols');
const meow = require('meow');
const updateNotifier = require('update-notifier');
const hasYarn = require('has-yarn');
const config = require('./config');
const {isPackageNameAvailable} = require('./npm/util');
const version = require('./version');
const util = require('./util');
const ui = require('./ui');
const np = require('.');

const cli = meow(`
Usage
$ np <version>

Version can be:
${version.SEMVER_INCREMENTS.join(' | ')} | 1.2.3

Options
--any-branch Allow publishing from any branch
--branch Name of the release branch (default: master)
--no-cleanup Skips cleanup of node_modules
--no-tests Skips tests
--yolo Skips cleanup and testing
--no-publish Skips publishing
--preview Show tasks without actually executing them
--tag Publish under a given dist-tag
--no-yarn Don't use Yarn
--contents Subdirectory to publish
--no-release-draft Skips opening a GitHub release draft
--test-script Name of npm run script to run tests before publishing (default: test)
--no-2fa Don't enable 2FA on new packages (not recommended)

Examples
$ np
$ np patch
$ np 1.0.2
$ np 1.0.2-beta.3 --tag=beta
$ np 1.0.2-beta.3 --tag=beta --contents=dist
`, {
booleanDefault: undefined,
flags: {
anyBranch: {
type: 'boolean'
},
branch: {
type: 'string'
},
cleanup: {
type: 'boolean'
},
tests: {
type: 'boolean'
},
yolo: {
type: 'boolean'
},
publish: {
type: 'boolean'
},
releaseDraft: {
type: 'boolean'
},
tag: {
type: 'string'
},
yarn: {
type: 'boolean'
},
contents: {
type: 'string'
},
preview: {
type: 'boolean'
},
testScript: {
type: 'string'
},
'2fa': {
type: 'boolean'
}
}
});

updateNotifier({pkg: cli.pkg}).notify();

(async () => {
const pkg = util.readPkg();

const defaultFlags = {
cleanup: true,
tests: true,
publish: true,
releaseDraft: true,
yarn: hasYarn(),
'2fa': true
};

const localConfig = await config();

const flags = {
...defaultFlags,
...localConfig,
...cli.flags
};

// Workaround for unintended auto-casing behavior from `meow`.
if ('2Fa' in flags) {
flags['2fa'] = flags['2Fa'];
}

const runPublish = flags.publish && !pkg.private;

const availability = flags.publish ? await isPackageNameAvailable(pkg) : {
isAvailable: false,
isUnknown: false
};

const version = cli.input.length > 0 ? cli.input[0] : false;

const options = await ui({
...flags,
availability,
version,
runPublish
}, pkg);

if (!options.confirm) {
process.exit(0);
}

console.log(); // Prints a newline for readability
const newPkg = await np(options.version, options);

if (options.preview) {
return;
}

console.log(`\n ${newPkg.name} ${newPkg.version} published 🎉`);
})().catch(error => {
console.error(`\n${logSymbols.error} ${error.message}`);
process.exit(1);
});
151 changes: 9 additions & 142 deletions source/cli.js
@@ -1,147 +1,14 @@
#!/usr/bin/env node
'use strict';
// eslint-disable-next-line import/no-unassigned-import
require('symbol-observable'); // Important: This needs to be first to prevent weird Observable incompatibilities
const logSymbols = require('log-symbols');
const meow = require('meow');
const updateNotifier = require('update-notifier');
const hasYarn = require('has-yarn');
const config = require('./config');
const {isPackageNameAvailable} = require('./npm/util');
const version = require('./version');
const util = require('./util');
const ui = require('./ui');
const np = require('.');
const importLocal = require('import-local');
const isInstalledGlobally = require('is-installed-globally');

const cli = meow(`
Usage
$ np <version>

Version can be:
${version.SEMVER_INCREMENTS.join(' | ')} | 1.2.3

Options
--any-branch Allow publishing from any branch
--branch Name of the release branch (default: master)
--no-cleanup Skips cleanup of node_modules
--no-tests Skips tests
--yolo Skips cleanup and testing
--no-publish Skips publishing
--preview Show tasks without actually executing them
--tag Publish under a given dist-tag
--no-yarn Don't use Yarn
--contents Subdirectory to publish
--no-release-draft Skips opening a GitHub release draft
--test-script Name of npm run script to run tests before publishing (default: test)
--no-2fa Don't enable 2FA on new packages (not recommended)

Examples
$ np
$ np patch
$ np 1.0.2
$ np 1.0.2-beta.3 --tag=beta
$ np 1.0.2-beta.3 --tag=beta --contents=dist
`, {
booleanDefault: undefined,
flags: {
anyBranch: {
type: 'boolean'
},
branch: {
type: 'string'
},
cleanup: {
type: 'boolean'
},
tests: {
type: 'boolean'
},
yolo: {
type: 'boolean'
},
publish: {
type: 'boolean'
},
releaseDraft: {
type: 'boolean'
},
tag: {
type: 'string'
},
yarn: {
type: 'boolean'
},
contents: {
type: 'string'
},
preview: {
type: 'boolean'
},
testScript: {
type: 'string'
},
'2fa': {
type: 'boolean'
}
}
});

updateNotifier({pkg: cli.pkg}).notify();

(async () => {
const pkg = util.readPkg();

const defaultFlags = {
cleanup: true,
tests: true,
publish: true,
releaseDraft: true,
yarn: hasYarn(),
'2fa': true
};

const localConfig = await config();

const flags = {
...defaultFlags,
...localConfig,
...cli.flags
};

// Workaround for unintended auto-casing behavior from `meow`.
if ('2Fa' in flags) {
flags['2fa'] = flags['2Fa'];
}

const runPublish = flags.publish && !pkg.private;

const availability = flags.publish ? await isPackageNameAvailable(pkg) : {
isAvailable: false,
isUnknown: false
};

const version = cli.input.length > 0 ? cli.input[0] : false;

const options = await ui({
...flags,
availability,
version,
runPublish
}, pkg);

if (!options.confirm) {
process.exit(0);
}

console.log(); // Prints a newline for readability
const newPkg = await np(options.version, options);

if (options.preview) {
return;
// Prefer the local installation
if (!importLocal(__filename)) {
if (isInstalledGlobally) {
console.log('Using global install of np.');
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this should be logged each time. You can use util.debuglog.

}

console.log(`\n ${newPkg.name} ${newPkg.version} published 🎉`);
})().catch(error => {
console.error(`\n${logSymbols.error} ${error.message}`);
process.exit(1);
});
// eslint-disable-next-line import/no-unassigned-import
require('./cli-implementation');
}