diff --git a/.circleci/template.yml b/.circleci/template.yml
index 5b153d1b6..fbc7cb521 100644
--- a/.circleci/template.yml
+++ b/.circleci/template.yml
@@ -204,7 +204,7 @@ jobs:
command: npm run release:prepare-packages -- --verbose
- run:
name: Publish the packages
- command: npm run release:publish-packages -- --verbose
+ command: npm run release:publish-packages -- --verbose --npm-tag next
- run:
name: Enable the redundant workflows option
command: yarn ckeditor5-dev-ci-circle-enable-auto-cancel-builds
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6c0f32626..03dbd1394 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,54 @@
Changelog
=========
+## [44.1.0](https://github.com/ckeditor/ckeditor5-dev/compare/v44.0.0...v44.1.0) (2024-10-15)
+
+> [!NOTE]
+> The release channel for this release is `next`.
+
+### Features
+
+* **[ci](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-ci)**: Created a new binary script called `ckeditor5-dev-ci-is-workflow-restarted` that returns with a non-zero exit code if a given workflow is executed for the first time. The restarted workflows exit with a zero exit code. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: A user-provided version will be checked against npm availability while generating a changelog. If it is already taken, the tools will not allow it to be used. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+
+### Other changes
+
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: The `updateVersions()` task will no longer verify if the specified `version` is available on npm. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: The `publishPackages()` task filters out already published packages to avoid pushing the same archive twice. Thanks to that, it can be a part of a process that would be restarted. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: The `publishPackages()` task tries to publish the package once again when it fails independently of the returned error code. Previously, it was scheduled only when the `E409` error occurred. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: Marked the `verifyPackagesPublishedCorrectly()` function is deprecated. Its responsibility has been merged with `publishPackages()`. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: The `commitAndTag()` task does not commit files if a tag for the specified version is already created. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ff7d7387cc46fc24d7992178f331f29df50f7e53))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: We do not spawn an npm process to download a package manifest from the npm registry. Instead, we send an HTTP request using the `pacote` package. Closes [ckeditor/ckeditor5#17191](https://github.com/ckeditor/ckeditor5/issues/17191). ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/a155390a2ee45190ce6edc49ed48f8e871aa641f))
+* **[release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools)**: The `getNpmTagFromVersion()` function returns a `'nightly'` string when passing a CKEditor 5 nightly version. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/4edf71cade5c73a8f9a7dbf80994490eeb400b60))
+
+### Released packages
+
+Check out the [Versioning policy](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/versioning-policy.html) guide for more information.
+
+
+Released packages (summary)
+
+Releases containing new features:
+
+* [@ckeditor/ckeditor5-dev-ci](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-ci/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools/v/44.1.0): v44.0.0 => v44.1.0
+
+Other releases:
+
+* [@ckeditor/ckeditor5-dev-build-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-build-tools/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-bump-year](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-bump-year/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-dependency-checker](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-dependency-checker/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-docs](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-docs/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-stale-bot](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-stale-bot/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-tests](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-tests/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-transifex](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-transifex/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-translations](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-translations/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-utils/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/ckeditor5-dev-web-crawler](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-web-crawler/v/44.1.0): v44.0.0 => v44.1.0
+* [@ckeditor/typedoc-plugins](https://www.npmjs.com/package/@ckeditor/typedoc-plugins/v/44.1.0): v44.0.0 => v44.1.0
+
+
+
## [44.0.0](https://github.com/ckeditor/ckeditor5-dev/compare/v43.0.0...v44.0.0) (2024-10-02)
### MAJOR BREAKING CHANGES [ℹ️](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/versioning-policy.html#major-and-minor-breaking-changes)
@@ -157,39 +205,6 @@ Other releases:
* [@ckeditor/typedoc-plugins](https://www.npmjs.com/package/@ckeditor/typedoc-plugins/v/44.0.0-alpha.3): v44.0.0-alpha.2 => v44.0.0-alpha.3
-
-## [44.0.0-alpha.2](https://github.com/ckeditor/ckeditor5-dev/compare/v44.0.0-alpha.1...v44.0.0-alpha.2) (2024-09-23)
-
-### Other changes
-
-* **[docs](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-docs)**: Support for passing an array of files to ignore when preparing API. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/3c858289a5826c9fceddfb380a4e35d48b44a099))
-* **[tests](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-tests)**: Restored the previous version of Chai and sinon-chai packages due to issues with processing ESM in Karma. ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/833ac929e4193b6791c79cdc5df05e67539c0c7f))
-* Use the "2021" edition as a default preset for CKEditor 5 files (`postcss-nesting`). ([commit](https://github.com/ckeditor/ckeditor5-dev/commit/ce3902d5855f1b3ba886dea1db195a5b27e22026))
-
-### Released packages
-
-Check out the [Versioning policy](https://ckeditor.com/docs/ckeditor5/latest/framework/guides/support/versioning-policy.html) guide for more information.
-
-
-Released packages (summary)
-
-Other releases:
-
-* [@ckeditor/ckeditor5-dev-build-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-build-tools/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-bump-year](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-bump-year/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-ci](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-ci/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-dependency-checker](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-dependency-checker/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-docs](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-docs/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-release-tools](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-release-tools/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-stale-bot](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-stale-bot/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-tests](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-tests/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-transifex](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-transifex/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-translations](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-translations/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-utils](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-utils/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/ckeditor5-dev-web-crawler](https://www.npmjs.com/package/@ckeditor/ckeditor5-dev-web-crawler/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-* [@ckeditor/typedoc-plugins](https://www.npmjs.com/package/@ckeditor/typedoc-plugins/v/44.0.0-alpha.2): v44.0.0-alpha.1 => v44.0.0-alpha.2
-
-
---
To see all releases, visit the [release page](https://github.com/ckeditor/ckeditor5-dev/releases).
diff --git a/packages/ckeditor5-dev-release-tools/lib/tasks/creategithubrelease.js b/packages/ckeditor5-dev-release-tools/lib/tasks/creategithubrelease.js
index 5da69a476..a07fcaacb 100644
--- a/packages/ckeditor5-dev-release-tools/lib/tasks/creategithubrelease.js
+++ b/packages/ckeditor5-dev-release-tools/lib/tasks/creategithubrelease.js
@@ -4,8 +4,8 @@
*/
import { Octokit } from '@octokit/rest';
-import semver from 'semver';
import * as transformCommitUtils from '../utils/transformcommitutils.js';
+import getNpmTagFromVersion from '../utils/getnpmtagfromversion.js';
const { getRepositoryUrl } = transformCommitUtils;
@@ -41,25 +41,13 @@ export default async function createGithubRelease( options ) {
owner: repositoryOwner,
repo: repositoryName,
body: description,
- prerelease: getVersionTag( version ) !== 'latest'
+ prerelease: getNpmTagFromVersion( version ) !== 'latest'
} );
}
return `https://github.com/${ repositoryOwner }/${ repositoryName }/releases/tag/v${ version }`;
}
-/**
- * Returns an npm tag based on the specified release version.
- *
- * @param {string} version
- * @returns {string}
- */
-function getVersionTag( version ) {
- const [ versionTag ] = semver.prerelease( version ) || [ 'latest' ];
-
- return versionTag;
-}
-
/**
* Resolves a promise containing a flag if the GitHub contains the release page for given version.
*
diff --git a/packages/ckeditor5-dev-release-tools/lib/utils/assertnpmtag.js b/packages/ckeditor5-dev-release-tools/lib/utils/assertnpmtag.js
index 8c8aa60ca..857cf8645 100644
--- a/packages/ckeditor5-dev-release-tools/lib/utils/assertnpmtag.js
+++ b/packages/ckeditor5-dev-release-tools/lib/utils/assertnpmtag.js
@@ -5,7 +5,12 @@
import fs from 'fs-extra';
import upath from 'upath';
-import semver from 'semver';
+import getNpmTagFromVersion from './getnpmtagfromversion.js';
+
+const ALLOWED_NPM_LATEST_TAGS = [
+ 'staging',
+ 'next'
+];
/**
* Checks if the npm tag matches the tag calculated from the package version. Verification takes place for all packages.
@@ -20,13 +25,13 @@ export default async function assertNpmTag( packagePaths, npmTag ) {
for ( const packagePath of packagePaths ) {
const packageJsonPath = upath.join( packagePath, 'package.json' );
const packageJson = await fs.readJson( packageJsonPath );
- const versionTag = getVersionTag( packageJson.version );
+ const versionTag = getNpmTagFromVersion( packageJson.version );
if ( versionTag === npmTag ) {
continue;
}
- if ( versionTag === 'latest' && npmTag === 'staging' ) {
+ if ( versionTag === 'latest' && ALLOWED_NPM_LATEST_TAGS.includes( npmTag ) ) {
continue;
}
@@ -37,22 +42,3 @@ export default async function assertNpmTag( packagePaths, npmTag ) {
throw new Error( errors.join( '\n' ) );
}
}
-
-/**
- * Returns the version tag for the package.
- *
- * For the official release, returns the "latest" tag. For a non-official release (pre-release), returns the version tag extracted from
- * the package version.
- *
- * @param {string} version
- * @returns {string}
- */
-function getVersionTag( version ) {
- const [ versionTag ] = semver.prerelease( version ) || [ 'latest' ];
-
- if ( versionTag.startsWith( 'nightly' ) ) {
- return 'nightly';
- }
-
- return versionTag;
-}
diff --git a/packages/ckeditor5-dev-release-tools/lib/utils/getnpmtagfromversion.js b/packages/ckeditor5-dev-release-tools/lib/utils/getnpmtagfromversion.js
index b3a45becd..8044fdd52 100644
--- a/packages/ckeditor5-dev-release-tools/lib/utils/getnpmtagfromversion.js
+++ b/packages/ckeditor5-dev-release-tools/lib/utils/getnpmtagfromversion.js
@@ -6,11 +6,20 @@
import semver from 'semver';
/**
+ * Returns a version tag from specified `version`.
+ *
+ * For the official release, returns the "latest" tag. For a non-official release (pre-release),
+ * returns the version tag extracted from the passed version.
+ *
* @param {string} version
* @returns {string}
*/
export default function getNpmTagFromVersion( version ) {
const [ versionTag ] = semver.prerelease( version ) || [ 'latest' ];
+ if ( versionTag.startsWith( 'nightly' ) ) {
+ return 'nightly';
+ }
+
return versionTag;
}
diff --git a/packages/ckeditor5-dev-release-tools/tests/tasks/creategithubrelease.js b/packages/ckeditor5-dev-release-tools/tests/tasks/creategithubrelease.js
index 2f1ac7bec..958a93572 100644
--- a/packages/ckeditor5-dev-release-tools/tests/tasks/creategithubrelease.js
+++ b/packages/ckeditor5-dev-release-tools/tests/tasks/creategithubrelease.js
@@ -5,6 +5,7 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
import createGithubRelease from '../../lib/tasks/creategithubrelease.js';
+import getNpmTagFromVersion from '../../lib/utils/getnpmtagfromversion.js';
import * as transformCommitUtils from '../../lib/utils/transformcommitutils.js';
const stubs = vi.hoisted( () => ( {
@@ -27,6 +28,7 @@ vi.mock( '@octokit/rest', () => ( {
} ) );
vi.mock( '../../lib/utils/transformcommitutils.js' );
+vi.mock( '../../lib/utils/getnpmtagfromversion.js' );
describe( 'createGithubRelease()', () => {
let options;
@@ -43,6 +45,7 @@ describe( 'createGithubRelease()', () => {
stubs.getLatestRelease.mockRejectedValue( { status: 404 } );
stubs.createRelease.mockResolvedValue();
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'latest' );
vi.mocked( transformCommitUtils.getRepositoryUrl ).mockReturnValue( 'https://github.com/ckeditor/ckeditor5-dev' );
} );
@@ -80,6 +83,8 @@ describe( 'createGithubRelease()', () => {
} );
it( 'creates a prerelease page when passing a major.minor.patch-prerelease version', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'alpha' );
+
options.version = '1.3.5-alpha.0';
await createGithubRelease( options );
diff --git a/packages/ckeditor5-dev-release-tools/tests/utils/assertnpmtag.js b/packages/ckeditor5-dev-release-tools/tests/utils/assertnpmtag.js
index 716ca19e1..167ed33ca 100644
--- a/packages/ckeditor5-dev-release-tools/tests/utils/assertnpmtag.js
+++ b/packages/ckeditor5-dev-release-tools/tests/utils/assertnpmtag.js
@@ -3,13 +3,19 @@
* For licensing, see LICENSE.md.
*/
-import { describe, expect, it, vi } from 'vitest';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
import fs from 'fs-extra';
import assertNpmTag from '../../lib/utils/assertnpmtag.js';
+import getNpmTagFromVersion from '../../lib/utils/getnpmtagfromversion.js';
vi.mock( 'fs-extra' );
+vi.mock( '../../lib/utils/getnpmtagfromversion.js' );
describe( 'assertNpmTag()', () => {
+ beforeEach( () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'latest' );
+ } );
+
it( 'should resolve the promise if list of packages is empty', async () => {
await assertNpmTag( [] );
} );
@@ -45,7 +51,7 @@ describe( 'assertNpmTag()', () => {
await assertNpmTag( [ 'ckeditor5-foo' ], 'latest' );
} );
- it( 'should not throw if version tag matches npm tag (version tag = "latest", npm tag = "staging")', async () => {
+ it( 'should not throw if version tag (latest) matches npm tag (staging)', async () => {
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '1.0.0'
@@ -54,7 +60,18 @@ describe( 'assertNpmTag()', () => {
await assertNpmTag( [ 'ckeditor5-foo' ], 'staging' );
} );
+ it( 'should not throw if version tag (latest) matches npm tag (next)', async () => {
+ vi.mocked( fs ).readJson.mockResolvedValue( {
+ name: 'ckeditor5-foo',
+ version: '1.0.0'
+ } );
+
+ await assertNpmTag( [ 'ckeditor5-foo' ], 'next' );
+ } );
+
it( 'should not throw if version tag matches npm tag (both "alpha")', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'alpha' );
+
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '1.0.0-alpha.0'
@@ -64,6 +81,8 @@ describe( 'assertNpmTag()', () => {
} );
it( 'should not throw if version tag matches npm tag (both "nightly")', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'nightly' );
+
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '0.0.0-nightly-20230517.0'
@@ -72,7 +91,7 @@ describe( 'assertNpmTag()', () => {
await assertNpmTag( [ 'ckeditor5-foo' ], 'nightly' );
} );
- it( 'should throw if version tag does not match npm tag (version tag = "latest", npm tag = "alpha")', async () => {
+ it( 'should throw if version tag (latest) does not match npm tag (alpha)', async () => {
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '1.0.0'
@@ -82,7 +101,7 @@ describe( 'assertNpmTag()', () => {
.rejects.toThrow( 'The version tag "latest" from "ckeditor5-foo" package does not match the npm tag "alpha".' );
} );
- it( 'should throw if version tag does not match npm tag (version tag = "latest", npm tag = "nightly")', async () => {
+ it( 'should throw if version (latest) tag does not match npm tag (nightly)', async () => {
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '1.0.0'
@@ -92,7 +111,9 @@ describe( 'assertNpmTag()', () => {
.rejects.toThrow( 'The version tag "latest" from "ckeditor5-foo" package does not match the npm tag "nightly".' );
} );
- it( 'should throw if version tag does not match npm tag (version tag = "alpha", npm tag = "staging")', async () => {
+ it( 'should throw if version tag (alpha) does not match npm tag (staging)', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'alpha' );
+
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '1.0.0-alpha.0'
@@ -102,7 +123,9 @@ describe( 'assertNpmTag()', () => {
.rejects.toThrow( 'The version tag "alpha" from "ckeditor5-foo" package does not match the npm tag "staging".' );
} );
- it( 'should throw if version tag does not match npm tag (version tag = "nightly", npm tag = "staging")', async () => {
+ it( 'should throw if version tag (nightly) does not match npm tag (staging)', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'nightly' );
+
vi.mocked( fs ).readJson.mockResolvedValue( {
name: 'ckeditor5-foo',
version: '0.0.0-nightly-20230517.0'
@@ -112,7 +135,43 @@ describe( 'assertNpmTag()', () => {
.rejects.toThrow( 'The version tag "nightly" from "ckeditor5-foo" package does not match the npm tag "staging".' );
} );
+ it( 'should throw if version tag (alpha) does not match npm tag (next)', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'alpha' );
+
+ vi.mocked( fs ).readJson.mockResolvedValue( {
+ name: 'ckeditor5-foo',
+ version: '1.0.0-alpha.0'
+ } );
+
+ await expect( assertNpmTag( [ 'ckeditor5-foo' ], 'next' ) )
+ .rejects.toThrow( 'The version tag "alpha" from "ckeditor5-foo" package does not match the npm tag "next".' );
+ } );
+
+ it( 'should throw if version tag (nightly) does not match npm tag (next)', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockReturnValue( 'nightly' );
+
+ vi.mocked( fs ).readJson.mockResolvedValue( {
+ name: 'ckeditor5-foo',
+ version: '0.0.0-nightly-20230517.0'
+ } );
+
+ await expect( assertNpmTag( [ 'ckeditor5-foo' ], 'next' ) )
+ .rejects.toThrow( 'The version tag "nightly" from "ckeditor5-foo" package does not match the npm tag "next".' );
+ } );
+
it( 'should throw one error for all packages with incorrect tags', async () => {
+ vi.mocked( getNpmTagFromVersion ).mockImplementation( input => {
+ if ( input === '1.0.0-alpha' ) {
+ return 'alpha';
+ }
+ if ( input === '0.0.0-nightly-20230517.0' ) {
+ return 'nightly';
+ }
+ if ( input === '0.0.1-rc.5' ) {
+ return 'rc';
+ }
+ } );
+
vi.mocked( fs ).readJson.mockImplementation( input => {
if ( input === 'ckeditor5-foo/package.json' ) {
return Promise.resolve( {
diff --git a/packages/ckeditor5-dev-release-tools/tests/utils/getnpmtagfromversion.js b/packages/ckeditor5-dev-release-tools/tests/utils/getnpmtagfromversion.js
index 1a457e85b..38b0c823b 100644
--- a/packages/ckeditor5-dev-release-tools/tests/utils/getnpmtagfromversion.js
+++ b/packages/ckeditor5-dev-release-tools/tests/utils/getnpmtagfromversion.js
@@ -24,4 +24,10 @@ describe( 'getNpmTagFromVersion()', () => {
expect( getNpmTagFromVersion( '2.1.0-alpha.0' ) ).to.equal( 'alpha' );
expect( getNpmTagFromVersion( '3.2.1-alpha.0' ) ).to.equal( 'alpha' );
} );
+
+ it( 'should return "nightly" when processing a 0.0.0-nightly-YYYYMMDD.X version', () => {
+ vi.mocked( semver.prerelease ).mockReturnValue( [ 'nightly', 0 ] );
+
+ expect( getNpmTagFromVersion( '0.0.0-nightly-20230517.0' ) ).to.equal( 'nightly' );
+ } );
} );
diff --git a/scripts/ci/is-project-ready-to-release.js b/scripts/ci/is-project-ready-to-release.js
index d2ffd7e56..a3a751631 100644
--- a/scripts/ci/is-project-ready-to-release.js
+++ b/scripts/ci/is-project-ready-to-release.js
@@ -12,7 +12,11 @@ import * as releaseTools from '@ckeditor/ckeditor5-dev-release-tools';
const changelogVersion = releaseTools.getLastFromChangelog();
const npmTag = releaseTools.getNpmTagFromVersion( changelogVersion );
-releaseTools.isVersionPublishableForTag( '@ckeditor/ckeditor5-dev-release-tools', changelogVersion, npmTag )
+// As long as CKEditor 5 supports the old installation methods, to avoid breaking the existing configurations,
+// packages from `ckeditor5-dev` are released as `@next`.
+const temporaryTagToCheck = npmTag === 'latest' ? 'next' : npmTag;
+
+releaseTools.isVersionPublishableForTag( '@ckeditor/ckeditor5-dev-release-tools', changelogVersion, temporaryTagToCheck )
.then( result => {
if ( !result ) {
console.error( `The proposed changelog (${ changelogVersion }) version is not higher than the already published one.` );