🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@changesets/cli

Package Overview
Dependencies
Maintainers
4
Versions
123
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
3.0.0-next.2
to
3.0.0-next.3
+2
-2
dist/changesets-cli-commit.js

@@ -1,2 +0,2 @@

const getAddMessage = async (changeset, options) => {
const getAddMessage = (changeset, options) => {
const skipCI = options?.skipCI === "add" || options?.skipCI === true;

@@ -6,3 +6,3 @@ const skipMsg = skipCI ? `\n\n[skip ci]\n` : "";

};
const getVersionMessage = async (releasePlan, options) => {
const getVersionMessage = (releasePlan, options) => {
const skipCI = options?.skipCI === "version" || options?.skipCI === true;

@@ -9,0 +9,0 @@ const publishableReleases = releasePlan.releases.filter(release => release.type !== "none");

@@ -1,6 +0,9 @@

import mri from 'mri';
import { createRequire } from 'node:module';
import { format } from 'node:util';
import { ExitError, PreEnterButInPreModeError, PreExitButNotInPreModeError, InternalError } from '@changesets/errors';
import * as logger from '@changesets/logger';
import { prefix, error, success, log, warn, info } from '@changesets/logger';
import { format } from 'util';
import mri from 'mri';
import fs from 'node:fs/promises';
import path, { resolve as resolve$1 } from 'node:path';
import { defaultWrittenConfig, read } from '@changesets/config';

@@ -10,18 +13,14 @@ import { getDependentsGraph } from '@changesets/get-dependents-graph';

import { getPackages } from '@manypkg/get-packages';
import fs from 'node:fs/promises';
import path, { resolve as resolve$1 } from 'path';
import pc from 'picocolors';
import { spawn } from 'child_process';
import { spawn } from 'node:child_process';
import { pathToFileURL, fileURLToPath } from 'node:url';
import * as git from '@changesets/git';
import { getChangedPackagesSinceRef, getCurrentCommitId } from '@changesets/git';
import writeChangeset from '@changesets/write';
import { writeChangeset } from '@changesets/write';
import { edit, ExternalEditor } from '@inquirer/external-editor';
import pc from 'picocolors';
import { resolve } from 'import-meta-resolve';
import { pathToFileURL } from 'node:url';
import ansiColors from 'ansi-colors';
import enuirer from 'enquirer';
import ansiColors from 'ansi-colors';
import semverLt from 'semver/functions/lt.js';
import { existsSync } from 'node:fs';
import path$1 from 'node:path';
import { createRequire } from 'node:module';
import { enterPre, exitPre, readPreState } from '@changesets/pre';

@@ -31,6 +30,6 @@ import semverParse from 'semver/functions/parse.js';

import { exec } from 'tinyexec';
import getReleasePlan from '@changesets/get-release-plan';
import { getReleasePlan } from '@changesets/get-release-plan';
import applyReleasePlan from '@changesets/apply-release-plan';
import readChangesets from '@changesets/read';
import assembleReleasePlan from '@changesets/assemble-release-plan';
import { assembleReleasePlan } from '@changesets/assemble-release-plan';
import { readChangesets } from '@changesets/read';

@@ -47,3 +46,6 @@ const COMMAND_HELP = {

async function getCommitFunctions(commit, cwd) {
function importResolveFromDir(specifier, dir) {
return resolve(specifier, pathToFileURL(path.join(dir, "x.mjs")).toString());
}
async function getCommitFunctions(commit, cwd, contextDir) {
let commitFunctions = {};

@@ -53,5 +55,10 @@ if (!commit) {

}
let commitOpts = commit[1];
let changesetPath = path.join(cwd, ".changeset");
let commitPath = resolve(commit[0], pathToFileURL(changesetPath).toString());
const commitOpts = commit[1];
const changesetPath = path.join(cwd, ".changeset");
let commitPath;
try {
commitPath = importResolveFromDir(commit[0], changesetPath);
} catch {
commitPath = importResolveFromDir(commit[0], contextDir);
}
let possibleCommitFunc = await import(commitPath);

@@ -94,3 +101,3 @@ if (possibleCommitFunc.default) {

const limit = Math.max(process.stdout.rows - 5, 10);
let cancelFlow = () => {
const cancelFlow = () => {
success("Cancelled... 👋 ");

@@ -196,3 +203,3 @@ process.exit();

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 to release the ${red("first major version")} of ${pkgJSON.name}?`));
const shouldReleaseFirstMajor = await askConfirm(bold(`Are you sure you want to release the ${red("first major version")} of ${pkgJSON.name}?`));
return shouldReleaseFirstMajor;

@@ -253,5 +260,5 @@ }

const packagesToRelease = await getPackagesToRelease(changedPackages, allPackages);
let pkgJsonsByName = getPkgJsonsByName(allPackages);
let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease);
let pkgsThatShouldBeMajorBumped = (await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), [{
const pkgJsonsByName = getPkgJsonsByName(allPackages);
const pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease);
const pkgsThatShouldBeMajorBumped = (await askCheckboxPlus(bold(`Which packages should have a ${red("major")} bump?`), [{
name: "all packages",

@@ -276,4 +283,4 @@ choices: packagesToRelease.map(pkgName => {

// of packages.
let pkgJson = pkgJsonsByName.get(pkgName);
let shouldReleaseFirstMajor = await confirmMajorRelease(pkgJson);
const pkgJson = pkgJsonsByName.get(pkgName);
const shouldReleaseFirstMajor = await confirmMajorRelease(pkgJson);
if (shouldReleaseFirstMajor) {

@@ -288,3 +295,3 @@ pkgsLeftToGetBumpTypeFor.delete(pkgName);

if (pkgsLeftToGetBumpTypeFor.size !== 0) {
let pkgsThatShouldBeMinorBumped = (await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [{
const pkgsThatShouldBeMinorBumped = (await askCheckboxPlus(bold(`Which packages should have a ${green("minor")} bump?`), [{
name: "all packages",

@@ -326,6 +333,6 @@ choices: [...pkgsLeftToGetBumpTypeFor].map(pkgName => {

} else {
let pkg = allPackages[0];
let type = await askList(`What kind of change is this for ${green(pkg.packageJson.name)}? (current version is ${pkg.packageJson.version})`, ["patch", "minor", "major"]);
const pkg = allPackages[0];
const type = await askList(`What kind of change is this for ${green(pkg.packageJson.name)}? (current version is ${pkg.packageJson.version})`, ["patch", "minor", "major"]);
if (type === "major") {
let shouldReleaseAsMajor = await confirmMajorRelease(pkg.packageJson);
const shouldReleaseAsMajor = await confirmMajorRelease(pkg.packageJson);
if (!shouldReleaseAsMajor) {

@@ -340,3 +347,3 @@ throw new ExitError(1);

}
if (messageFromCli !== undefined) {
if (messageFromCli != null) {
return {

@@ -361,3 +368,3 @@ confirmed: false,

}
} catch (err) {
} catch {
log("An error happened using external editor. Please type your summary here:");

@@ -403,3 +410,3 @@ }

if (packages.packages.length === 0) {
error(`No packages found. You might have ${packages.tool} workspaces configured but no packages yet?`);
error(`No packages found. You might have ${packages.tool.type} workspaces configured but no packages yet?`);
throw new ExitError(1);

@@ -452,3 +459,3 @@ }

getAddMessage
}, commitOpts] = await getCommitFunctions(config.commit, cwd);
}, commitOpts] = await getCommitFunctions(config.commit, cwd, path.dirname(fileURLToPath(import.meta.url)));
if (getAddMessage) {

@@ -461,3 +468,3 @@ await git.add(path.resolve(changesetBase, `${changesetID}.md`), cwd);

}
let hasMajorChange = [...newChangeset.releases].find(c => c.type === "major");
const hasMajorChange = [...newChangeset.releases].find(c => c.type === "major");
if (hasMajorChange) {

@@ -486,9 +493,9 @@ warn("This Changeset includes a major change and we STRONGLY recommend adding more information to the changeset:");

const require$1 = createRequire(import.meta.url);
const pkgPath = path$1.dirname(require$1.resolve("@changesets/cli/package.json"));
const pkgPath = path.dirname(require$1.resolve("@changesets/cli/package.json"));
const defaultConfig = `${JSON.stringify(defaultWrittenConfig, null, 2)}\n`;
async function init(cwd) {
const changesetBase = path$1.resolve(cwd, ".changeset");
const changesetBase = path.resolve(cwd, ".changeset");
if (existsSync(changesetBase)) {
if (!existsSync(path$1.join(changesetBase, "config.json"))) {
if (existsSync(path$1.join(changesetBase, "config.js"))) {
if (!existsSync(path.join(changesetBase, "config.json"))) {
if (existsSync(path.join(changesetBase, "config.js"))) {
error("It looks like you're using the version 1 `.changeset/config.js` file");

@@ -502,3 +509,3 @@ error("The format of the config object has significantly changed in v2 as well");

}
await fs.writeFile(path$1.resolve(changesetBase, "config.json"), defaultConfig);
await fs.writeFile(path.resolve(changesetBase, "config.json"), defaultConfig);
} else {

@@ -508,6 +515,6 @@ warn("It looks like you already have changesets initialized. You should be able to run changeset commands no problems.");

} else {
await fs.cp(path$1.resolve(pkgPath, "./default-files"), changesetBase, {
await fs.cp(path.resolve(pkgPath, "./default-files"), changesetBase, {
recursive: true
});
await fs.writeFile(path$1.resolve(changesetBase, "config.json"), defaultConfig);
await fs.writeFile(path.resolve(changesetBase, "config.json"), defaultConfig);
log(`Thanks for choosing ${pc.green("changesets")} to help manage your versioning and publishing.\n`);

@@ -551,13 +558,27 @@ log("You should be set up to start using changesets now!\n");

function withResolvers() {
const rv = {};
rv.promise = new Promise((resolve, reject) => {
rv.resolve = resolve;
rv.reject = reject;
});
return rv;
async function getUntaggedPackages(packages, cwd, tool) {
const packageWithTags = await Promise.all(packages.map(async pkg => {
const tagName = tool.type === "root" ? `v${pkg.packageJson.version}` : `${pkg.packageJson.name}@${pkg.packageJson.version}`;
const isMissingTag = !((await git.tagExists(tagName, cwd)) || (await git.remoteTagExists(tagName)));
return {
pkg,
isMissingTag
};
}));
const untagged = [];
for (const packageWithTag of packageWithTags) {
if (packageWithTag.isMissingTag) {
untagged.push({
name: packageWithTag.pkg.packageJson.name,
newVersion: packageWithTag.pkg.packageJson.version
});
}
}
return untagged;
}
function promiseTry(fn) {
return new Promise(resolve => resolve(fn()));
}
// TODO [engine:node@>=23]: remove when supported by minimum node version
const promiseTryPolyfill = (fn, ...args) => new Promise(resolve => resolve(fn(...args)));
const promiseTry = "try" in Promise ? Promise.try.bind(Promise) : promiseTryPolyfill;
function createPromiseQueue(concurrency) {

@@ -591,3 +612,3 @@ const jobs = [];

reject
} = withResolvers();
} = Promise.withResolvers();
jobs.push({

@@ -614,3 +635,3 @@ fn,

return JSON.parse(str);
} catch (err) {
} catch {
// move past the potentially leading `{` so the regexp in the loop can try to match for the next `{`

@@ -668,3 +689,3 @@ str = str.slice(1);

try {
let result = await exec("pnpm", ["--version"], {
const result = await exec("pnpm", ["--version"], {
nodeOptions: {

@@ -674,9 +695,9 @@ cwd

});
let version = result.stdout.toString().trim();
let parsed = semverParse(version);
const version = result.stdout.toString().trim();
const parsed = semverParse(version);
return {
name: "pnpm",
shouldAddNoGitChecks: parsed?.major === undefined ? false : parsed.major >= 5
shouldAddNoGitChecks: parsed?.major == null ? false : parsed.major >= 5
};
} catch (e) {
} catch {
return {

@@ -698,3 +719,3 @@ name: "pnpm",

};
let result = await exec("npm", ["profile", "get", "--json"], {
const result = await exec("npm", ["profile", "get", "--json"], {
nodeOptions: {

@@ -708,3 +729,3 @@ env: Object.assign({}, process.env, envOverride)

}
let json = jsonParse(result.stdout.toString());
const json = jsonParse(result.stdout.toString());
if (json.error || !json.tfa || !json.tfa.mode) {

@@ -774,3 +795,3 @@ return false;

async function infoAllow404(packageJson) {
let pkgInfo = await getPackageInfo(packageJson);
const pkgInfo = await getPackageInfo(packageJson);
if (pkgInfo.error?.code === "E404") {

@@ -866,3 +887,3 @@ warn(`Received 404 for npm info ${pc.cyan(`"${packageJson.name}"`)}`);

}
let {
const {
exitCode,

@@ -887,3 +908,3 @@ stdout,

// Note that the `--json` output is always printed at the end so this should work
let json = getLastJsonObjectFromString(stderr.toString()) || getLastJsonObjectFromString(stdout.toString());
const json = getLastJsonObjectFromString(stderr.toString()) || getLastJsonObjectFromString(stdout.toString());
if (json?.error) {

@@ -937,3 +958,3 @@ if (json.error.code === "E403" && isAlreadyPublishedError(json.error.summary)) {

if (tag) return tag;
if (preState !== undefined && pkgInfo.publishedState !== "only-pre") {
if (preState != null && pkgInfo.publishedState !== "only-pre") {
return preState.tag;

@@ -988,3 +1009,3 @@ }

return Promise.all(unpublishedPackagesInfo.map(pkgInfo => {
let pkg = packagesByName.get(pkgInfo.name);
const pkg = packagesByName.get(pkgInfo.name);
return publishAPackage(pkg, access, twoFactorState, getReleaseTag(pkgInfo, preState, tag));

@@ -1020,3 +1041,3 @@ }));

publishedState = "published";
if (preState !== undefined) {
if (preState != null) {
if (response.pkgInfo.versions && response.pkgInfo.versions.every(version => semverParse(version).prerelease[0] === preState.tag)) {

@@ -1045,3 +1066,3 @@ publishedState = "only-pre";

info(`${name} is being published because our local version (${localVersion}) has not been published on npm`);
if (preState !== undefined && publishedState === "only-pre") {
if (preState != null && publishedState === "only-pre") {
info(`${name} is being published to ${pc.cyan("latest")} rather than ${pc.cyan(preState.tag)} because there has not been a regular release of it yet`);

@@ -1057,23 +1078,2 @@ }

async function getUntaggedPackages(packages, cwd, tool) {
const packageWithTags = await Promise.all(packages.map(async pkg => {
const tagName = tool.type === "root" ? `v${pkg.packageJson.version}` : `${pkg.packageJson.name}@${pkg.packageJson.version}`;
const isMissingTag = !((await git.tagExists(tagName, cwd)) || (await git.remoteTagExists(tagName)));
return {
pkg,
isMissingTag
};
}));
const untagged = [];
for (const packageWithTag of packageWithTags) {
if (packageWithTag.isMissingTag) {
untagged.push({
name: packageWithTag.pkg.packageJson.name,
newVersion: packageWithTag.pkg.packageJson.version
});
}
}
return untagged;
}
function logReleases(pkgs) {

@@ -1083,4 +1083,4 @@ const mappedPkgs = pkgs.map(p => `${p.name}@${p.newVersion}`).join("\n");

}
let importantSeparator$1 = pc.red("===============================IMPORTANT!===============================");
let importantEnd$1 = pc.red("----------------------------------------------------------------------");
const importantSeparator$1 = pc.red("===============================IMPORTANT!===============================");
const importantEnd$1 = pc.red("----------------------------------------------------------------------");
function showNonLatestTagWarning(tag, preState) {

@@ -1102,3 +1102,3 @@ warn(importantSeparator$1);

const releaseTag = tag && tag.length > 0 ? tag : undefined;
let preState = await readPreState(cwd);
const preState = await readPreState(cwd);
if (releaseTag && preState && preState.mode === "pre") {

@@ -1254,4 +1254,4 @@ error("Releasing under custom tag is not allowed in pre mode");

let importantSeparator = pc.red("===============================IMPORTANT!===============================");
let importantEnd = pc.red("----------------------------------------------------------------------");
const importantSeparator = pc.red("===============================IMPORTANT!===============================");
const importantEnd = pc.red("----------------------------------------------------------------------");
async function version(cwd, options, config) {

@@ -1266,3 +1266,3 @@ const releaseConfig = {

warn(importantSeparator);
if (options.snapshot !== undefined) {
if (options.snapshot != null) {
error("Snapshot release is not allowed in pre mode");

@@ -1278,5 +1278,5 @@ log("To resolve this exit the pre mode by running `changeset pre exit`");

}
if (changesets.length === 0 && (preState === undefined || preState.mode !== "exit")) {
if (changesets.length === 0 && (preState == null || preState.mode !== "exit")) {
warn("No unreleased changesets found, exiting.");
return;
throw new ExitError(1);
}

@@ -1290,6 +1290,7 @@ const packages = await getPackages(cwd);

} : undefined);
const [...touchedFiles] = await applyReleasePlan(releasePlan, packages, releaseConfig, options.snapshot, import.meta.dirname);
const contextDir = path.dirname(fileURLToPath(import.meta.url));
const [...touchedFiles] = await applyReleasePlan(releasePlan, packages, releaseConfig, options.snapshot, contextDir);
const [{
getVersionMessage
}, commitOpts] = await getCommitFunctions(releaseConfig.commit, cwd);
}, commitOpts] = await getCommitFunctions(releaseConfig.commit, cwd, contextDir);
if (getVersionMessage) {

@@ -1330,3 +1331,3 @@ let touchedFile;

await fs.access(path.resolve(packages.rootDir, ".changeset"));
} catch (err) {
} catch {
error("There is no .changeset folder. ");

@@ -1341,3 +1342,3 @@ error("If this is the first time `changesets` have been used in this project, run `yarn changeset init` to get set up.");

} catch (e) {
let oldConfigExists = await fs.access(path.resolve(packages.rootDir, ".changeset/config.js")).then(() => true, () => false);
const oldConfigExists = await fs.access(path.resolve(packages.rootDir, ".changeset/config.js")).then(() => true, () => false);
if (oldConfigExists) {

@@ -1413,3 +1414,3 @@ error("It looks like you're using the version 1 `.changeset/config.js` file");

// Validate that items in ignoreArrayFromCmd are valid project names
let pkgNames = new Set(packages.packages.map(({
const pkgNames = new Set(packages.packages.map(({
packageJson

@@ -1519,3 +1520,3 @@ }) => packageJson.name));

validateCommandFlags("pre", flags);
let command = input[1];
const command = input[1];
if (command !== "enter" && command !== "exit") {

@@ -1525,3 +1526,3 @@ error("`enter`, `exit` or `snapshot` must be passed after prerelease");

}
let tag = input[2];
const tag = input[2];
if (command === "enter" && typeof tag !== "string") {

@@ -1608,3 +1609,2 @@ error(`A tag must be passed when using prerelease enter`);

if (parsed.version && args.length === 1) {
// eslint-disable-next-line import/no-extraneous-dependencies
console.log(require("@changesets/cli/package.json").version);

@@ -1632,5 +1632,3 @@ process.exit(0);

- @changesets/cli@${
// eslint-disable-next-line import/no-extraneous-dependencies
require("@changesets/cli/package.json").version}
- @changesets/cli@${require("@changesets/cli/package.json").version}
- node@${process.version}

@@ -1637,0 +1635,0 @@

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

import type { CommitFunctions } from "@changesets/types";
declare const defaultCommitFunctions: Required<CommitFunctions>;
declare const defaultCommitFunctions: {
getAddMessage: import("@changesets/types").GetAddMessage;
getVersionMessage: import("@changesets/types").GetVersionMessage;
};
export default defaultCommitFunctions;
{
"name": "@changesets/cli",
"version": "3.0.0-next.2",
"version": "3.0.0-next.3",
"description": "Organise your package versioning and publishing to make both contributors and maintainers happy",

@@ -45,16 +45,2 @@ "bin": {

"dependencies": {
"@changesets/apply-release-plan": "^8.0.0-next.2",
"@changesets/assemble-release-plan": "^7.0.0-next.2",
"@changesets/changelog-git": "^1.0.0-next.2",
"@changesets/config": "^4.0.0-next.2",
"@changesets/errors": "^1.0.0-next.1",
"@changesets/get-dependents-graph": "^3.0.0-next.2",
"@changesets/get-release-plan": "^5.0.0-next.2",
"@changesets/git": "^4.0.0-next.2",
"@changesets/logger": "^1.0.0-next.1",
"@changesets/pre": "^3.0.0-next.2",
"@changesets/read": "^1.0.0-next.2",
"@changesets/should-skip-package": "^1.0.0-next.2",
"@changesets/types": "^7.0.0-next.2",
"@changesets/write": "^1.0.0-next.2",
"@inquirer/external-editor": "^1.0.2",

@@ -69,15 +55,30 @@ "@manypkg/get-packages": "^3.0.0",

"semver": "^7.5.3",
"tinyexec": "^1.0.2"
"tinyexec": "^1.0.2",
"@changesets/apply-release-plan": "^8.0.0-next.3",
"@changesets/assemble-release-plan": "^7.0.0-next.3",
"@changesets/changelog-git": "^1.0.0-next.3",
"@changesets/config": "^4.0.0-next.3",
"@changesets/errors": "^1.0.0-next.2",
"@changesets/get-dependents-graph": "^3.0.0-next.3",
"@changesets/get-release-plan": "^5.0.0-next.3",
"@changesets/git": "^4.0.0-next.3",
"@changesets/logger": "^1.0.0-next.2",
"@changesets/pre": "^3.0.0-next.3",
"@changesets/read": "^1.0.0-next.3",
"@changesets/should-skip-package": "^1.0.0-next.3",
"@changesets/types": "^7.0.0-next.3",
"@changesets/write": "^1.0.0-next.3"
},
"devDependencies": {
"@changesets/parse": "1.0.0-next.2",
"@changesets/test-utils": "0.0.9-next.2",
"@types/semver": "^7.7.1",
"human-id": "^4.1.1",
"outdent": "^0.8.0",
"vitest": "^4.1.2"
"vitest": "^4.1.5",
"@changesets/changelog-github": "1.0.0-next.3",
"@changesets/parse": "1.0.0-next.3",
"@changesets/test-utils": "0.0.9-next.3"
},
"engines": {
"node": ">=20.19.0"
"node": "^22.11 || ^24 || >=26"
}
}
}
## @changesets/cli 🦋
[![npm package](https://img.shields.io/npm/v/@changesets/cli)](https://npmjs.com/package/@changesets/cli)
[![View changelog](https://img.shields.io/badge/Explore%20Changelog-brightgreen)](./CHANGELOG.md)
[![Open on npmx.dev](https://npmx.dev/api/registry/badge/version/@changesets/cli?name=true)](https://npmx.dev/package/@changesets/cli)
[![View changelog](https://npmx.dev/api/registry/badge/version/@changesets/cli?color=229fe4&value=View+changelog&label=+)](./CHANGELOG.md)

@@ -10,5 +10,4 @@ The primary implementation of [changesets](https://github.com/changesets/changesets). Helps you manage the versioning

This package is intended as a successor to `@atlaskit/build-releases` with a more general focus. It works in
[bolt](https://www.npmjs.com/package/bolt) multi-package repositories, [yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) multi-package repositories, and
in single-package repositories.
This package is intended as a successor to `@atlaskit/build-releases` with a more general focus.
It supports single-package repositories as well as [pnpm](https://pnpm.io/workspaces), [yarn](https://yarnpkg.com/features/workspaces), and [npm](https://docs.npmjs.com/cli/v11/using-npm/workspaces) workspaces.

@@ -15,0 +14,0 @@ ## Getting Started