Socket
Socket
Sign inDemoInstall

@changesets/cli

Package Overview
Dependencies
Maintainers
3
Versions
91
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@changesets/cli - npm Package Compare versions

Comparing version 2.5.1 to 2.5.2

8

CHANGELOG.md
# @changesets/cli
## 2.5.2
### Patch Changes
- [`184a653`](https://github.com/atlassian/changesets/commit/184a653de2d050f877b91d0ad319f00683bbc7ff) [#278](https://github.com/atlassian/changesets/pull/278) Thanks [@mitchellhamilton](https://github.com/mitchellhamilton)! - Use a single prompt for the semver version type when there is only a single package in the repo in `changeset add`
![changeset add command with single package repo](https://user-images.githubusercontent.com/11481355/75123292-40f78f00-56fa-11ea-9e16-fe3f5e2d9cf5.gif)
## 2.5.1

@@ -4,0 +12,0 @@

218

dist/cli.cjs.dev.js

@@ -16,3 +16,2 @@ 'use strict';

var git = require('@changesets/git');
var _defineProperty = _interopDefault(require('@babel/runtime/helpers/defineProperty'));
var prettier = _interopDefault(require('prettier'));

@@ -132,6 +131,23 @@ var humanId = _interopDefault(require('human-id'));

async function askList(message, choices) {
const name = `List-${serialId()}`;
return enquirer.prompt([{
choices,
message,
name,
// @ts-ignore
prefix: logger.prefix,
type: "select",
onCancel: cancelFlow
}]).then(responses => responses[name]).catch(err => {
logger.error(err);
});
}
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
async function writeChangeset(changeset, cwd) {

@@ -166,17 +182,2 @@ const {

function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
async function getWorkspaces (opts) {
let workspaces = await getWorkspaces$1(_objectSpread$1({
tools: ["yarn", "bolt", "pnpm", "root"]
}, opts));
if (workspaces === null) {
return [];
}
return workspaces;
}
const {

@@ -191,2 +192,14 @@ green,

async function confirmMajorRelease(pkgJSON) {
if (semver.lt(pkgJSON.version, "1.0.0")) {
// prettier-ignore
logger.log(yellow(`WARNING: Releasing a major version for ${green(pkgJSON.name)} will be its ${red('first major release')}.`));
logger.log(yellow(`If you are unsure if this is correct, contact the package's maintainers$ ${red("before committing this changeset")}.`));
let shouldReleaseFirstMajor = await askConfirm(bold(`Are you sure you want still want to release the ${red("first major release")} of ${pkgJSON.name}?`));
return shouldReleaseFirstMajor;
}
return true;
}
async function getPackagesToRelease(changedPackages, allPackages) {

@@ -240,75 +253,82 @@ function askInitialReleaseQuestion(defaultChoiceList) {

async function createChangeset(changedPackages, cwd) {
const allPackages = await getWorkspaces({
cwd
});
const packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = new Map(allPackages.map(({
name,
config
}) => [name, config]));
async function createChangeset(changedPackages, allPackages) {
const releases = [];
let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease);
let pkgsThatShouldBeMajorBumped = await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), packagesToRelease.map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
for (const pkgName of pkgsThatShouldBeMajorBumped) {
// for packages that are under v1, we want to make sure major releases are intended,
// as some repo-wide sweeping changes have mistakenly release first majors
// of packages.
let {
version
} = pkgJsonsByName.get(pkgName);
if (allPackages.length > 1) {
const packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = new Map(allPackages.map(({
name,
config
}) => [name, config]));
let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease);
let pkgsThatShouldBeMajorBumped = await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), packagesToRelease.map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
if (semver.lt(version, "1.0.0")) {
// prettier-ignore
logger.log(yellow(`WARNING: Releasing a major version for ${green(pkgName)} will be its ${red('first major release')}.`));
logger.log(yellow(`If you are unsure if this is correct, contact the package's maintainers$ ${red("before committing this changeset")}.`));
let shouldReleaseFirstMajor = await askConfirm(bold(`Are you sure you want still want to release the ${red("first major release")} of ${pkgName}?`));
for (const pkgName of pkgsThatShouldBeMajorBumped) {
// for packages that are under v1, we want to make sure major releases are intended,
// as some repo-wide sweeping changes have mistakenly release first majors
// of packages.
let pkgJson = pkgJsonsByName.get(pkgName);
let shouldReleaseFirstMajor = await confirmMajorRelease(pkgJson);
if (!shouldReleaseFirstMajor) {
continue;
if (shouldReleaseFirstMajor) {
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "major"
});
}
}
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "major"
});
}
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
let pkgsThatShouldBeMinorBumped = await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [...pkgsLeftToGetBumpTypeFor].map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
let pkgsThatShouldBeMinorBumped = await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [...pkgsLeftToGetBumpTypeFor].map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
for (const pkgName of pkgsThatShouldBeMinorBumped) {
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "minor"
});
}
}
for (const pkgName of pkgsThatShouldBeMinorBumped) {
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "minor"
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
logger.log(`The following packages will be ${blue("patch")} bumped:`);
pkgsLeftToGetBumpTypeFor.forEach(pkgName => {
logger.log(formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version));
});
for (const pkgName of pkgsLeftToGetBumpTypeFor) {
releases.push({
name: pkgName,
type: "patch"
});
}
}
}
} else {
let pkg = allPackages[0];
let type = await askList(`What kind of change is this for ${green(pkg.name)}? (current version is ${pkg.config.version})`, ["patch", "minor", "major"]);
console.log(type);
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
logger.log(`The following packages will be ${blue("patch")} bumped:`);
pkgsLeftToGetBumpTypeFor.forEach(pkgName => {
logger.log(formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version));
});
if (type === "major") {
let shouldReleaseAsMajor = await confirmMajorRelease(pkg.config);
for (const pkgName of pkgsLeftToGetBumpTypeFor) {
releases.push({
name: pkgName,
type: "patch"
});
if (!shouldReleaseAsMajor) {
throw new errors.ExitError(1);
}
}
releases.push({
name: pkg.name,
type
});
}

@@ -330,3 +350,3 @@

function printConfirmationMessage(changeset) {
function printConfirmationMessage(changeset, repoHasMultiplePackages) {
function getReleasesOfType(type) {

@@ -343,15 +363,38 @@ return changeset.releases.filter(release => release.type === type).map(release => release.name);

if (patchReleases.length > 0) logger.log(`${chalk.green("[Patch]")}\n ${patchReleases.join(", ")}`);
const message = outdent`
if (repoHasMultiplePackages) {
const message = outdent`
${chalk.red("========= NOTE ========")}
All dependents of these packages that will be incompatible with the new version will be ${chalk.red("patch bumped")} when this changeset is applied.`;
const prettyMessage = boxen(message, {
borderStyle: "double",
align: "center"
});
logger.log(prettyMessage);
const prettyMessage = boxen(message, {
borderStyle: "double",
align: "center"
});
logger.log(prettyMessage);
}
}
function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
async function getWorkspaces (opts) {
let workspaces = await getWorkspaces$1(_objectSpread$1({
tools: ["yarn", "bolt", "pnpm", "root"]
}, opts));
if (workspaces === null) {
return [];
}
return workspaces;
}
async function add(cwd, {
empty
}, config) {
const allPackages = await getWorkspaces({
cwd
});
const changesetBase = path.resolve(cwd, ".changeset");

@@ -372,4 +415,4 @@ let newChangeset, confirmChangeset;

const changePackagesName = changedPackages.filter(a => a).map(pkg => pkg.name);
newChangeset = await createChangeset(changePackagesName, cwd);
printConfirmationMessage(newChangeset);
newChangeset = await createChangeset(changePackagesName, allPackages);
printConfirmationMessage(newChangeset, allPackages.length > 1);
confirmChangeset = await askConfirm("Is this your desired changeset?");

@@ -427,4 +470,7 @@ }

async function version(cwd, config) {
let [changesets, preState] = await Promise.all([readChangesets(cwd), pre$1.readPreState(cwd), removeEmptyFolders(path.resolve(cwd, ".changeset"))]);
let [_changesets, _preState] = await Promise.all([readChangesets(cwd), pre$1.readPreState(cwd), removeEmptyFolders(path.resolve(cwd, ".changeset"))]); // temporarily needed because of TS 3.7 regression - https://github.com/microsoft/TypeScript/issues/33752
const changesets = _changesets;
const preState = _preState;
if (preState !== undefined && preState.mode === "pre") {

@@ -431,0 +477,0 @@ logger.warn(importantSeparator);

@@ -7,3 +7,3 @@ "use strict";

var meow = _interopDefault(require("meow")), config = require("@changesets/config"), errors = require("@changesets/errors"), logger = require("@changesets/logger"), fs = _interopDefault(require("fs-extra")), path = _interopDefault(require("path")), getWorkspaces$1 = _interopDefault(require("get-workspaces")), chalk = _interopDefault(require("chalk")), termSize = _interopDefault(require("term-size")), enquirer = require("enquirer"), git = require("@changesets/git"), _defineProperty = _interopDefault(require("@babel/runtime/helpers/defineProperty")), prettier = _interopDefault(require("prettier")), humanId = _interopDefault(require("human-id")), semver = _interopDefault(require("semver")), boxen = _interopDefault(require("boxen")), outdent = _interopDefault(require("outdent")), applyReleasePlan = _interopDefault(require("@changesets/apply-release-plan")), readChangesets = _interopDefault(require("@changesets/read")), getDependentsgraph = _interopDefault(require("get-dependents-graph")), assembleReleasePlan = _interopDefault(require("@changesets/assemble-release-plan")), pre$1 = require("@changesets/pre"), pLimit = _interopDefault(require("p-limit")), spawn = _interopDefault(require("spawndamnit")), isCI$1 = _interopDefault(require("is-ci")), table = _interopDefault(require("tty-table")), getReleasePlan = _interopDefault(require("@changesets/get-release-plan")), util = require("util");
var meow = _interopDefault(require("meow")), config = require("@changesets/config"), errors = require("@changesets/errors"), logger = require("@changesets/logger"), fs = _interopDefault(require("fs-extra")), path = _interopDefault(require("path")), getWorkspaces$1 = _interopDefault(require("get-workspaces")), chalk = _interopDefault(require("chalk")), termSize = _interopDefault(require("term-size")), enquirer = require("enquirer"), git = require("@changesets/git"), prettier = _interopDefault(require("prettier")), humanId = _interopDefault(require("human-id")), semver = _interopDefault(require("semver")), boxen = _interopDefault(require("boxen")), outdent = _interopDefault(require("outdent")), applyReleasePlan = _interopDefault(require("@changesets/apply-release-plan")), readChangesets = _interopDefault(require("@changesets/read")), getDependentsgraph = _interopDefault(require("get-dependents-graph")), assembleReleasePlan = _interopDefault(require("@changesets/assemble-release-plan")), pre$1 = require("@changesets/pre"), pLimit = _interopDefault(require("p-limit")), spawn = _interopDefault(require("spawndamnit")), isCI$1 = _interopDefault(require("is-ci")), table = _interopDefault(require("tty-table")), getReleasePlan = _interopDefault(require("@changesets/get-release-plan")), util = require("util");

@@ -80,2 +80,16 @@ const pkgPath = path.dirname(require.resolve("@changesets/cli/package.json"));

async function askList(message, choices) {
const name = `List-${serialId()}`;
return enquirer.prompt([ {
choices: choices,
message: message,
name: name,
prefix: logger.prefix,
type: "select",
onCancel: cancelFlow
} ]).then(responses => responses[name]).catch(err => {
logger.error(err);
});
}
function ownKeys(object, enumerableOnly) {

@@ -85,5 +99,5 @@ var keys = Object.keys(object);

var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter(function(sym) {
enumerableOnly && (symbols = symbols.filter((function(sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
})), keys.push.apply(keys, symbols);
}))), keys.push.apply(keys, symbols);
}

@@ -96,7 +110,7 @@ return keys;

var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys(source, !0).forEach(function(key) {
i % 2 ? ownKeys(Object(source), !0).forEach((function(key) {
_defineProperty(target, key, source[key]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(source).forEach(function(key) {
})) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach((function(key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}));
}

@@ -106,2 +120,11 @@ return target;

function _defineProperty(obj, key, value) {
return key in obj ? Object.defineProperty(obj, key, {
value: value,
enumerable: !0,
configurable: !0,
writable: !0
}) : obj[key] = value, obj;
}
async function writeChangeset(changeset, cwd) {

@@ -117,34 +140,13 @@ const {summary: summary, releases: releases} = changeset, changesetBase = path.resolve(cwd, ".changeset"), changesetID = humanId({

function ownKeys$1(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter(function(sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
})), keys.push.apply(keys, symbols);
}
return keys;
}
const {green: green, yellow: yellow, red: red, bold: bold, blue: blue, cyan: cyan} = chalk;
function _objectSpread$1(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys$1(source, !0).forEach(function(key) {
_defineProperty(target, key, source[key]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(source).forEach(function(key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
async function confirmMajorRelease(pkgJSON) {
if (semver.lt(pkgJSON.version, "1.0.0")) {
return logger.log(yellow(`WARNING: Releasing a major version for ${green(pkgJSON.name)} will be its ${red("first major release")}.`)),
logger.log(yellow(`If you are unsure if this is correct, contact the package's maintainers$ ${red("before committing this changeset")}.`)),
await askConfirm(bold(`Are you sure you want still want to release the ${red("first major release")} of ${pkgJSON.name}?`));
}
return target;
return !0;
}
async function getWorkspaces(opts) {
let workspaces = await getWorkspaces$1(_objectSpread$1({
tools: [ "yarn", "bolt", "pnpm", "root" ]
}, opts));
return null === workspaces ? [] : workspaces;
}
const {green: green, yellow: yellow, red: red, bold: bold, blue: blue, cyan: cyan} = chalk;
async function getPackagesToRelease(changedPackages, allPackages) {

@@ -176,44 +178,48 @@ function askInitialReleaseQuestion(defaultChoiceList) {

async function createChangeset(changedPackages, cwd) {
const allPackages = await getWorkspaces({
cwd: cwd
}), packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = new Map(allPackages.map(({name: name, config: config}) => [ name, config ]));
async function createChangeset(changedPackages, allPackages) {
const releases = [];
let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease), pkgsThatShouldBeMajorBumped = await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), packagesToRelease.map(pkgName => ({
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
})));
for (const pkgName of pkgsThatShouldBeMajorBumped) {
let {version: version} = pkgJsonsByName.get(pkgName);
if (semver.lt(version, "1.0.0")) {
if (logger.log(yellow(`WARNING: Releasing a major version for ${green(pkgName)} will be its ${red("first major release")}.`)),
logger.log(yellow(`If you are unsure if this is correct, contact the package's maintainers$ ${red("before committing this changeset")}.`)),
!await askConfirm(bold(`Are you sure you want still want to release the ${red("first major release")} of ${pkgName}?`))) continue;
}
pkgsLeftToGetBumpTypeFor.delete(pkgName), releases.push({
if (allPackages.length > 1) {
const packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = new Map(allPackages.map(({name: name, config: config}) => [ name, config ])), pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease), pkgsThatShouldBeMajorBumped = await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), packagesToRelease.map(pkgName => ({
name: pkgName,
type: "major"
});
}
if (0 !== pkgsLeftToGetBumpTypeFor.size) {
let pkgsThatShouldBeMinorBumped = await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [ ...pkgsLeftToGetBumpTypeFor ].map(pkgName => ({
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
})));
for (const pkgName of pkgsThatShouldBeMinorBumped) pkgsLeftToGetBumpTypeFor.delete(pkgName),
for (const pkgName of pkgsThatShouldBeMajorBumped) {
let pkgJson = pkgJsonsByName.get(pkgName);
await confirmMajorRelease(pkgJson) && (pkgsLeftToGetBumpTypeFor.delete(pkgName),
releases.push({
name: pkgName,
type: "major"
}));
}
if (0 !== pkgsLeftToGetBumpTypeFor.size) {
let pkgsThatShouldBeMinorBumped = await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [ ...pkgsLeftToGetBumpTypeFor ].map(pkgName => ({
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
})));
for (const pkgName of pkgsThatShouldBeMinorBumped) pkgsLeftToGetBumpTypeFor.delete(pkgName),
releases.push({
name: pkgName,
type: "minor"
});
}
if (0 !== pkgsLeftToGetBumpTypeFor.size) {
logger.log(`The following packages will be ${blue("patch")} bumped:`), pkgsLeftToGetBumpTypeFor.forEach(pkgName => {
logger.log(formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version));
});
for (const pkgName of pkgsLeftToGetBumpTypeFor) releases.push({
name: pkgName,
type: "patch"
});
}
} else {
let pkg = allPackages[0], type = await askList(`What kind of change is this for ${green(pkg.name)}? (current version is ${pkg.config.version})`, [ "patch", "minor", "major" ]);
if (console.log(type), "major" === type) {
if (!await confirmMajorRelease(pkg.config)) throw new errors.ExitError(1);
}
releases.push({
name: pkgName,
type: "minor"
name: pkg.name,
type: type
});
}
if (0 !== pkgsLeftToGetBumpTypeFor.size) {
logger.log(`The following packages will be ${blue("patch")} bumped:`), pkgsLeftToGetBumpTypeFor.forEach(pkgName => {
logger.log(formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version));
});
for (const pkgName of pkgsLeftToGetBumpTypeFor) releases.push({
name: pkgName,
type: "patch"
});
}
logger.log("Please enter a summary for this change (this will be in the changelogs)");

@@ -229,3 +235,3 @@ let summary = await askQuestion("Summary");

function printConfirmationMessage(changeset) {
function printConfirmationMessage(changeset, repoHasMultiplePackages) {
function getReleasesOfType(type) {

@@ -236,16 +242,59 @@ return changeset.releases.filter(release => release.type === type).map(release => release.name);

const majorReleases = getReleasesOfType("major"), minorReleases = getReleasesOfType("minor"), patchReleases = getReleasesOfType("patch");
majorReleases.length > 0 && logger.log(`${chalk.green("[Major]")}\n ${majorReleases.join(", ")}`),
if (majorReleases.length > 0 && logger.log(`${chalk.green("[Major]")}\n ${majorReleases.join(", ")}`),
minorReleases.length > 0 && logger.log(`${chalk.green("[Minor]")}\n ${minorReleases.join(", ")}`),
patchReleases.length > 0 && logger.log(`${chalk.green("[Patch]")}\n ${patchReleases.join(", ")}`);
const message = outdent`
patchReleases.length > 0 && logger.log(`${chalk.green("[Patch]")}\n ${patchReleases.join(", ")}`),
repoHasMultiplePackages) {
const message = outdent`
${chalk.red("========= NOTE ========")}
All dependents of these packages that will be incompatible with the new version will be ${chalk.red("patch bumped")} when this changeset is applied.`, prettyMessage = boxen(message, {
borderStyle: "double",
align: "center"
});
logger.log(prettyMessage);
borderStyle: "double",
align: "center"
});
logger.log(prettyMessage);
}
}
function ownKeys$1(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter((function(sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
}))), keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread$1(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys$1(Object(source), !0).forEach((function(key) {
_defineProperty$1(target, key, source[key]);
})) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach((function(key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
}));
}
return target;
}
function _defineProperty$1(obj, key, value) {
return key in obj ? Object.defineProperty(obj, key, {
value: value,
enumerable: !0,
configurable: !0,
writable: !0
}) : obj[key] = value, obj;
}
async function getWorkspaces(opts) {
let workspaces = await getWorkspaces$1(_objectSpread$1({
tools: [ "yarn", "bolt", "pnpm", "root" ]
}, opts));
return null === workspaces ? [] : workspaces;
}
async function add(cwd, {empty: empty}, config) {
const changesetBase = path.resolve(cwd, ".changeset");
const allPackages = await getWorkspaces({
cwd: cwd
}), changesetBase = path.resolve(cwd, ".changeset");
let newChangeset, confirmChangeset;

@@ -260,3 +309,3 @@ if (empty) newChangeset = {

})).filter(a => a).map(pkg => pkg.name);
printConfirmationMessage(newChangeset = await createChangeset(changePackagesName, cwd)),
newChangeset = await createChangeset(changePackagesName, allPackages), printConfirmationMessage(newChangeset, allPackages.length > 1),
confirmChangeset = await askConfirm("Is this your desired changeset?");

@@ -290,3 +339,4 @@ }

async function version(cwd, config) {
let [changesets, preState] = await Promise.all([ readChangesets(cwd), pre$1.readPreState(cwd), removeEmptyFolders(path.resolve(cwd, ".changeset")) ]);
let [_changesets, _preState] = await Promise.all([ readChangesets(cwd), pre$1.readPreState(cwd), removeEmptyFolders(path.resolve(cwd, ".changeset")) ]);
const changesets = _changesets, preState = _preState;
if (void 0 !== preState && "pre" === preState.mode && (logger.warn(importantSeparator),

@@ -293,0 +343,0 @@ logger.warn("You are in prerelease mode"), logger.warn("If you meant to do a normal release you should revert these changes and run `changeset pre exits`"),

@@ -12,3 +12,2 @@ import meow from 'meow';

import { getChangedPackagesSinceRef, add as add$1, commit, tag } from '@changesets/git';
import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
import prettier from 'prettier';

@@ -128,6 +127,23 @@ import humanId from 'human-id';

async function askList(message, choices) {
const name = `List-${serialId()}`;
return prompt([{
choices,
message,
name,
// @ts-ignore
prefix,
type: "select",
onCancel: cancelFlow
}]).then(responses => responses[name]).catch(err => {
error(err);
});
}
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
async function writeChangeset(changeset, cwd) {

@@ -162,17 +178,2 @@ const {

function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
async function getWorkspaces (opts) {
let workspaces = await getWorkspaces$1(_objectSpread$1({
tools: ["yarn", "bolt", "pnpm", "root"]
}, opts));
if (workspaces === null) {
return [];
}
return workspaces;
}
const {

@@ -187,2 +188,14 @@ green,

async function confirmMajorRelease(pkgJSON) {
if (semver.lt(pkgJSON.version, "1.0.0")) {
// prettier-ignore
log(yellow(`WARNING: Releasing a major version for ${green(pkgJSON.name)} will be its ${red('first major release')}.`));
log(yellow(`If you are unsure if this is correct, contact the package's maintainers$ ${red("before committing this changeset")}.`));
let shouldReleaseFirstMajor = await askConfirm(bold(`Are you sure you want still want to release the ${red("first major release")} of ${pkgJSON.name}?`));
return shouldReleaseFirstMajor;
}
return true;
}
async function getPackagesToRelease(changedPackages, allPackages) {

@@ -236,75 +249,82 @@ function askInitialReleaseQuestion(defaultChoiceList) {

async function createChangeset(changedPackages, cwd) {
const allPackages = await getWorkspaces({
cwd
});
const packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = new Map(allPackages.map(({
name,
config
}) => [name, config]));
async function createChangeset(changedPackages, allPackages) {
const releases = [];
let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease);
let pkgsThatShouldBeMajorBumped = await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), packagesToRelease.map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
for (const pkgName of pkgsThatShouldBeMajorBumped) {
// for packages that are under v1, we want to make sure major releases are intended,
// as some repo-wide sweeping changes have mistakenly release first majors
// of packages.
let {
version
} = pkgJsonsByName.get(pkgName);
if (allPackages.length > 1) {
const packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = new Map(allPackages.map(({
name,
config
}) => [name, config]));
let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease);
let pkgsThatShouldBeMajorBumped = await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), packagesToRelease.map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
if (semver.lt(version, "1.0.0")) {
// prettier-ignore
log(yellow(`WARNING: Releasing a major version for ${green(pkgName)} will be its ${red('first major release')}.`));
log(yellow(`If you are unsure if this is correct, contact the package's maintainers$ ${red("before committing this changeset")}.`));
let shouldReleaseFirstMajor = await askConfirm(bold(`Are you sure you want still want to release the ${red("first major release")} of ${pkgName}?`));
for (const pkgName of pkgsThatShouldBeMajorBumped) {
// for packages that are under v1, we want to make sure major releases are intended,
// as some repo-wide sweeping changes have mistakenly release first majors
// of packages.
let pkgJson = pkgJsonsByName.get(pkgName);
let shouldReleaseFirstMajor = await confirmMajorRelease(pkgJson);
if (!shouldReleaseFirstMajor) {
continue;
if (shouldReleaseFirstMajor) {
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "major"
});
}
}
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "major"
});
}
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
let pkgsThatShouldBeMinorBumped = await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [...pkgsLeftToGetBumpTypeFor].map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
let pkgsThatShouldBeMinorBumped = await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [...pkgsLeftToGetBumpTypeFor].map(pkgName => {
return {
name: pkgName,
message: formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version)
};
}));
for (const pkgName of pkgsThatShouldBeMinorBumped) {
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "minor"
});
}
}
for (const pkgName of pkgsThatShouldBeMinorBumped) {
pkgsLeftToGetBumpTypeFor.delete(pkgName);
releases.push({
name: pkgName,
type: "minor"
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
log(`The following packages will be ${blue("patch")} bumped:`);
pkgsLeftToGetBumpTypeFor.forEach(pkgName => {
log(formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version));
});
for (const pkgName of pkgsLeftToGetBumpTypeFor) {
releases.push({
name: pkgName,
type: "patch"
});
}
}
}
} else {
let pkg = allPackages[0];
let type = await askList(`What kind of change is this for ${green(pkg.name)}? (current version is ${pkg.config.version})`, ["patch", "minor", "major"]);
console.log(type);
if (pkgsLeftToGetBumpTypeFor.size !== 0) {
log(`The following packages will be ${blue("patch")} bumped:`);
pkgsLeftToGetBumpTypeFor.forEach(pkgName => {
log(formatPkgNameAndVersion(pkgName, pkgJsonsByName.get(pkgName).version));
});
if (type === "major") {
let shouldReleaseAsMajor = await confirmMajorRelease(pkg.config);
for (const pkgName of pkgsLeftToGetBumpTypeFor) {
releases.push({
name: pkgName,
type: "patch"
});
if (!shouldReleaseAsMajor) {
throw new ExitError(1);
}
}
releases.push({
name: pkg.name,
type
});
}

@@ -326,3 +346,3 @@

function printConfirmationMessage(changeset) {
function printConfirmationMessage(changeset, repoHasMultiplePackages) {
function getReleasesOfType(type) {

@@ -339,15 +359,38 @@ return changeset.releases.filter(release => release.type === type).map(release => release.name);

if (patchReleases.length > 0) log(`${chalk.green("[Patch]")}\n ${patchReleases.join(", ")}`);
const message = outdent`
if (repoHasMultiplePackages) {
const message = outdent`
${chalk.red("========= NOTE ========")}
All dependents of these packages that will be incompatible with the new version will be ${chalk.red("patch bumped")} when this changeset is applied.`;
const prettyMessage = boxen(message, {
borderStyle: "double",
align: "center"
});
log(prettyMessage);
const prettyMessage = boxen(message, {
borderStyle: "double",
align: "center"
});
log(prettyMessage);
}
}
function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
async function getWorkspaces (opts) {
let workspaces = await getWorkspaces$1(_objectSpread$1({
tools: ["yarn", "bolt", "pnpm", "root"]
}, opts));
if (workspaces === null) {
return [];
}
return workspaces;
}
async function add(cwd, {
empty
}, config) {
const allPackages = await getWorkspaces({
cwd
});
const changesetBase = path.resolve(cwd, ".changeset");

@@ -368,4 +411,4 @@ let newChangeset, confirmChangeset;

const changePackagesName = changedPackages.filter(a => a).map(pkg => pkg.name);
newChangeset = await createChangeset(changePackagesName, cwd);
printConfirmationMessage(newChangeset);
newChangeset = await createChangeset(changePackagesName, allPackages);
printConfirmationMessage(newChangeset, allPackages.length > 1);
confirmChangeset = await askConfirm("Is this your desired changeset?");

@@ -423,4 +466,7 @@ }

async function version(cwd, config) {
let [changesets, preState] = await Promise.all([readChangesets(cwd), readPreState(cwd), removeEmptyFolders(path.resolve(cwd, ".changeset"))]);
let [_changesets, _preState] = await Promise.all([readChangesets(cwd), readPreState(cwd), removeEmptyFolders(path.resolve(cwd, ".changeset"))]); // temporarily needed because of TS 3.7 regression - https://github.com/microsoft/TypeScript/issues/33752
const changesets = _changesets;
const preState = _preState;
if (preState !== undefined && preState.mode === "pre") {

@@ -427,0 +473,0 @@ warn(importantSeparator);

@@ -1,5 +0,5 @@

import { Release } from "@changesets/types";
export default function createChangeset(changedPackages: Array<string>, cwd: string): Promise<{
import { Release, Workspace } from "@changesets/types";
export default function createChangeset(changedPackages: Array<string>, allPackages: Workspace[]): Promise<{
summary: string;
releases: Array<Release>;
}>;

@@ -5,2 +5,2 @@ import { Release } from "@changesets/types";

summary: string;
}): void;
}, repoHasMultiplePackages: boolean): void;
declare function askCheckboxPlus(message: string, choices: Array<any>, format?: (arg: any) => any): Promise<Array<string>>;
declare function askQuestion(message: string): Promise<string>;
declare function askConfirm(message: string): Promise<boolean>;
declare function askList(message: string, choices: Array<string>): Promise<string>;
declare function askList<Choice extends string>(message: string, choices: readonly Choice[]): Promise<Choice>;
export { askCheckboxPlus, askQuestion, askConfirm, askList };
{
"name": "@changesets/cli",
"version": "2.5.1",
"version": "2.5.2",
"description": "Organise your package versioning and publishing to make both contributors and maintainers happy",

@@ -5,0 +5,0 @@ "bin": {

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc