diff --git a/apps/generator-cli/src/app/controllers/version-manager.controller.ts b/apps/generator-cli/src/app/controllers/version-manager.controller.ts index aea4e5d6bb0..e5c652600b5 100644 --- a/apps/generator-cli/src/app/controllers/version-manager.controller.ts +++ b/apps/generator-cli/src/app/controllers/version-manager.controller.ts @@ -95,30 +95,34 @@ export class VersionManagerController { ); }; - private table = (versions: Version[]) => - this.ui.table({ + private table = (versions: Version[]) => { + // Keep row order identical to the order returned in versions. + const rows = versions.map((version) => { + const stable = version.versionTags.includes('stable'); + const selected = this.service.isSelectedVersion(version.version); + const versionTags = version.versionTags.map((t) => + t === 'latest' ? chalk.green(t) : t, + ); + + return { + value: version, + short: version.version, + row: { + '☐': selected ? '☒' : '☐', + releasedAt: version.releaseDate.toISOString().split('T')[0], + version: stable + ? chalk.yellow(version.version) + : chalk.gray(version.version), + installed: version.installed ? chalk.green('yes') : chalk.red('no'), + versionTags: versionTags.join(' '), + }, + }; + }); + + return this.ui.table({ printColNum: false, message: 'The following releases are available:', - rows: versions.map((version) => { - const stable = version.versionTags.includes('stable'); - const selected = this.service.isSelectedVersion(version.version); - const versionTags = version.versionTags.map((t) => - t === 'latest' ? chalk.green(t) : t, - ); - - return { - value: version, - short: version.version, - row: { - '☐': selected ? '☒' : '☐', - releasedAt: version.releaseDate.toISOString().split('T')[0], - version: stable - ? chalk.yellow(version.version) - : chalk.gray(version.version), - installed: version.installed ? chalk.green('yes') : chalk.red('no'), - versionTags: versionTags.join(' '), - }, - }; - }), + rows, }); + }; } diff --git a/apps/generator-cli/src/app/services/version-manager.service.spec.ts b/apps/generator-cli/src/app/services/version-manager.service.spec.ts index 58a00ffc246..69783ee524d 100644 --- a/apps/generator-cli/src/app/services/version-manager.service.spec.ts +++ b/apps/generator-cli/src/app/services/version-manager.service.spec.ts @@ -189,10 +189,10 @@ describe('VersionManagerService', () => { it('returns all versions', () => { expect(returnValue).toEqual([ - expectedVersions['4.2.0'], + expectedVersions['5.0.0-beta2'], expectedVersions['5.0.0-beta'], expectedVersions['4.3.1'], - expectedVersions['5.0.0-beta2'], + expectedVersions['4.2.0'], expectedVersions['3.0.0-alpha'], ]); }); @@ -201,15 +201,15 @@ describe('VersionManagerService', () => { describe.each([ [ ['beta'], - [expectedVersions['5.0.0-beta'], expectedVersions['5.0.0-beta2']], + [expectedVersions['5.0.0-beta2'], expectedVersions['5.0.0-beta']], ], [['beta', 'alpha'], []], [ ['5'], - [expectedVersions['5.0.0-beta'], expectedVersions['5.0.0-beta2']], + [expectedVersions['5.0.0-beta2'], expectedVersions['5.0.0-beta']], ], [['4.2'], [expectedVersions['4.2.0']]], - [['stable'], [expectedVersions['4.2.0'], expectedVersions['4.3.1']]], + [['stable'], [expectedVersions['4.3.1'], expectedVersions['4.2.0']]], ])('using tags %s', (tags, expectation) => { beforeEach(async () => { returnValue = await fixture.search(tags).toPromise(); diff --git a/apps/generator-cli/src/app/services/version-manager.service.ts b/apps/generator-cli/src/app/services/version-manager.service.ts index 03c704342d6..b80448a9783 100644 --- a/apps/generator-cli/src/app/services/version-manager.service.ts +++ b/apps/generator-cli/src/app/services/version-manager.service.ts @@ -103,7 +103,11 @@ export class VersionManagerService { search(tags: string[]) { return this.getAll().pipe( - map((versions) => this.filterVersionsByTags(versions, tags)) + map((versions) => + [...this.filterVersionsByTags(versions, tags)].sort((l, r) => + compareVersions(r.version, l.version), + ), + ) ); }