@changesets/cli
Advanced tools
Comparing version 2.5.1 to 2.5.2
# @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 @@ |
@@ -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": { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
166645
2809
90
1
0
9