From 0c50e4429dd789acd57569263300329df9d8c6cb Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Fri, 11 Mar 2022 11:29:57 +0100 Subject: [PATCH 01/16] chore: replace next with releaseType --- .../__tests__/create-release-issue.test.ts | 26 +++---- scripts/release/create-release-issue.ts | 70 ++++++++++++------- scripts/release/process-release.ts | 1 + scripts/tsconfig.json | 2 +- 4 files changed, 59 insertions(+), 40 deletions(-) diff --git a/scripts/release/__tests__/create-release-issue.test.ts b/scripts/release/__tests__/create-release-issue.test.ts index 604c711f17..6226073d3f 100644 --- a/scripts/release/__tests__/create-release-issue.test.ts +++ b/scripts/release/__tests__/create-release-issue.test.ts @@ -32,15 +32,15 @@ describe('create release issue', () => { getVersionChangesText({ javascript: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', }, php: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', }, java: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', }, }) ).toMatchInlineSnapshot(` @@ -55,16 +55,16 @@ describe('create release issue', () => { getVersionChangesText({ javascript: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', }, php: { current: '0.0.1', - next: '0.0.1', + releaseType: null, noCommit: true, }, java: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', }, }) ).toMatchInlineSnapshot(` @@ -79,15 +79,15 @@ describe('create release issue', () => { getVersionChangesText({ javascript: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', }, php: { current: '0.0.1', - next: '0.0.1', + releaseType: 'minor', }, java: { current: '0.0.1', - next: '0.0.2', + releaseType: 'patch', skipRelease: true, }, }) @@ -95,7 +95,7 @@ describe('create release issue', () => { "- [x] javascript: v0.0.1 -> v0.0.2 - [ ] java: v0.0.1 -> v0.0.2 - No \`feat\` or \`fix\` commit, thus unchecked by default. - - [x] php: v0.0.1 -> v0.0.1" + - [x] php: v0.0.1 -> v0.1.0" `); }); @@ -123,7 +123,7 @@ describe('create release issue', () => { ], }); - expect(versions.javascript.next).toEqual('1.0.0'); + expect(versions.javascript.releaseType).toEqual('major'); }); it('bumps minor version for feat', () => { @@ -150,7 +150,7 @@ describe('create release issue', () => { ], }); - expect(versions.php.next).toEqual('0.1.0'); + expect(versions.php.releaseType).toEqual('minor'); }); it('bumps patch version for fix', () => { @@ -177,7 +177,7 @@ describe('create release issue', () => { ], }); - expect(versions.java.next).toEqual('0.0.2'); + expect(versions.java.releaseType).toEqual('patch'); }); it('marks noCommit for languages without any commit', () => { diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index e50b4b2eba..0ff2dfd076 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -2,6 +2,7 @@ import { Octokit } from '@octokit/rest'; import dotenv from 'dotenv'; import semver from 'semver'; +import type { ReleaseType } from 'semver'; import { GENERATORS, LANGUAGES, ROOT_ENV_PATH, run } from '../common'; @@ -12,23 +13,26 @@ dotenv.config({ path: ROOT_ENV_PATH }); type Version = { current: string; - next?: string | null; - noCommit?: boolean; + releaseType: ReleaseType | null; skipRelease?: boolean; + noCommit?: boolean; }; type Versions = { [lang: string]: Version; }; -function readVersions(): Versions { - const versions = {}; +type VersionsWithoutReleaseType = { + [lang: string]: Omit; +}; + +function readVersions(): VersionsWithoutReleaseType { + const versions: VersionsWithoutReleaseType = {}; Object.values(GENERATORS).forEach((gen) => { if (!versions[gen.language]) { versions[gen.language] = { current: gen.additionalProperties?.packageVersion, - next: undefined, }; } }); @@ -37,7 +41,7 @@ function readVersions(): Versions { export function getVersionChangesText(versions: Versions): string { return LANGUAGES.map((lang) => { - const { current, next, noCommit, skipRelease } = versions[lang]; + const { current, releaseType, noCommit, skipRelease } = versions[lang]; if (noCommit) { return `- ~${lang}: v${current} (${TEXT.noCommit})~`; @@ -47,6 +51,7 @@ export function getVersionChangesText(versions: Versions): string { return `- ~${lang}: (${TEXT.currentVersionNotFound})~`; } + const next = semver.inc(current, releaseType!); const checked = skipRelease ? ' ' : 'x'; return [ `- [${checked}] ${lang}: v${current} -> v${next}`, @@ -97,29 +102,34 @@ export function parseCommit(commit: string): Commit { }; } +/* eslint-disable no-param-reassign */ export function decideReleaseStrategy({ versions, commits, }: { - versions: Versions; + versions: VersionsWithoutReleaseType; commits: PassedCommit[]; }): Versions { - const ret: Versions = { ...versions }; - - LANGUAGES.forEach((lang) => { + return Object.entries(versions).reduce((acc: Versions, [lang, version]) => { const commitsPerLang = commits.filter((commit) => commit.lang === lang); const currentVersion = versions[lang].current; if (commitsPerLang.length === 0) { - ret[lang].next = currentVersion; - ret[lang].noCommit = true; - return; + acc[lang] = { + ...version, + noCommit: true, + releaseType: null, + }; + return acc; } if (semver.prerelease(currentVersion)) { // if version is like 0.1.2-beta.1, it increases to 0.1.2-beta.2, even if there's a breaking change. - ret[lang].next = semver.inc(currentVersion, 'prerelease'); - return; + acc[lang] = { + ...version, + releaseType: 'prerelease', + }; + return acc; } if ( @@ -127,24 +137,31 @@ export function decideReleaseStrategy({ commit.message.includes('BREAKING CHANGE') ) ) { - ret[lang].next = semver.inc(currentVersion, 'major'); - return; + acc[lang] = { + ...version, + releaseType: 'major', + }; + return acc; } const commitTypes = new Set(commitsPerLang.map(({ type }) => type)); if (commitTypes.has('feat')) { - ret[lang].next = semver.inc(currentVersion, 'minor'); - return; - } - - ret[lang].next = semver.inc(currentVersion, 'patch'); - if (!commitTypes.has('fix')) { - ret[lang].skipRelease = true; + acc[lang] = { + ...version, + releaseType: 'minor', + }; + return acc; } - }); - return ret; + acc[lang] = { + ...version, + releaseType: 'patch', + ...(commitTypes.has('fix') ? undefined : { skipRelease: true }), + }; + return acc; + }, {}); } +/* eslint-enable no-param-reassign */ async function createReleaseIssue(): Promise { if (!process.env.GITHUB_TOKEN) { @@ -270,6 +287,7 @@ async function createReleaseIssue(): Promise { }); } +// JS version of `if __name__ == '__main__'` if (require.main === module) { createReleaseIssue(); } diff --git a/scripts/release/process-release.ts b/scripts/release/process-release.ts index b0e3a4a1e2..4f53bb7818 100755 --- a/scripts/release/process-release.ts +++ b/scripts/release/process-release.ts @@ -219,6 +219,7 @@ async function processRelease(): Promise { await run(`git push --tags`); } +// JS version of `if __name__ == '__main__'` if (require.main === module) { processRelease(); } diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json index eacb895f56..25f5d607f0 100644 --- a/scripts/tsconfig.json +++ b/scripts/tsconfig.json @@ -6,5 +6,5 @@ "outDir": "dist" }, "include": ["**/*.ts"], - "exclude": ["dist", "*.json", "node_modules"] + "exclude": ["dist", "*.json", "node_modules", "**/*.test.ts"] } From 8d5e21946a6fd6d35a85c1aa16abcb5de8725d86 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Fri, 11 Mar 2022 14:44:12 +0100 Subject: [PATCH 02/16] chore: parse new issue body correctly --- .../__tests__/create-release-issue.test.ts | 16 ++++++++-------- .../release/__tests__/process-release.test.ts | 12 ++++++------ scripts/release/create-release-issue.ts | 3 ++- scripts/release/process-release.ts | 13 ++++++++++--- scripts/release/text.ts | 17 +++++++++++++++++ 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/scripts/release/__tests__/create-release-issue.test.ts b/scripts/release/__tests__/create-release-issue.test.ts index 6226073d3f..b779e65121 100644 --- a/scripts/release/__tests__/create-release-issue.test.ts +++ b/scripts/release/__tests__/create-release-issue.test.ts @@ -44,9 +44,9 @@ describe('create release issue', () => { }, }) ).toMatchInlineSnapshot(` - "- [x] javascript: v0.0.1 -> v0.0.2 - - [x] java: v0.0.1 -> v0.0.2 - - [x] php: v0.0.1 -> v0.0.2" + "- [x] javascript: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_ + - [x] java: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_ + - [x] php: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_" `); }); @@ -68,8 +68,8 @@ describe('create release issue', () => { }, }) ).toMatchInlineSnapshot(` - "- [x] javascript: v0.0.1 -> v0.0.2 - - [x] java: v0.0.1 -> v0.0.2 + "- [x] javascript: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_ + - [x] java: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_ - ~php: v0.0.1 (no commit)~" `); }); @@ -92,10 +92,10 @@ describe('create release issue', () => { }, }) ).toMatchInlineSnapshot(` - "- [x] javascript: v0.0.1 -> v0.0.2 - - [ ] java: v0.0.1 -> v0.0.2 + "- [x] javascript: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_ + - [ ] java: v0.0.1 -> \`patch\` _(e.g. v0.0.2)_ - No \`feat\` or \`fix\` commit, thus unchecked by default. - - [x] php: v0.0.1 -> v0.1.0" + - [x] php: v0.0.1 -> \`minor\` _(e.g. v0.1.0)_" `); }); diff --git a/scripts/release/__tests__/process-release.test.ts b/scripts/release/__tests__/process-release.test.ts index 2f174f234d..e1597e21cb 100644 --- a/scripts/release/__tests__/process-release.test.ts +++ b/scripts/release/__tests__/process-release.test.ts @@ -5,9 +5,9 @@ describe('process release', () => { const versions = getVersionsToRelease(` ## Version Changes - - [x] javascript: v1.0.0 -> v1.1.0 - - [x] php: v2.0.0 -> v2.0.1 - - [ ] java: v3.0.0 -> v3.0.1 + - [x] javascript: v1.0.0 -> \`minor\` (e.g. v1.1.0) + - [x] php: v2.0.0 -> \`patch\` (e.g. v2.0.1) + - [ ] java: v3.0.0 -> \`patch\` (e.g. v3.0.1) `); expect(Object.keys(versions)).toEqual(['javascript', 'php']); @@ -22,9 +22,9 @@ describe('process release', () => { getLangsToUpdateRepo(` ## Version Changes -- [ ] javascript: v1.0.0 -> v1.1.0 -- [x] php: v2.0.0 -> v2.0.1 -- [ ] java: v3.0.0 -> v3.0.1 +- [ ] javascript: v1.0.0 -> \`minor\` (e.g. v1.1.0) +- [x] php: v2.0.0 -> \`patch\` (e.g. v2.0.1) +- [ ] java: v3.0.0 -> \`patch\` (e.g. v3.0.1) `) ).toEqual(['javascript', 'java']); }); diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index 0ff2dfd076..110537c673 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -54,7 +54,7 @@ export function getVersionChangesText(versions: Versions): string { const next = semver.inc(current, releaseType!); const checked = skipRelease ? ' ' : 'x'; return [ - `- [${checked}] ${lang}: v${current} -> v${next}`, + `- [${checked}] ${lang}: v${current} -> \`${releaseType}\` _(e.g. v${next})_`, skipRelease && TEXT.descriptionForSkippedLang, ] .filter(Boolean) @@ -258,6 +258,7 @@ async function createReleaseIssue(): Promise { TEXT.versionChangeHeader, versionChanges, TEXT.descriptionVersionChanges, + TEXT.indenpendentVersioning, TEXT.changelogHeader, TEXT.changelogDescription, changelogs, diff --git a/scripts/release/process-release.ts b/scripts/release/process-release.ts index 4f53bb7818..a4669d4590 100755 --- a/scripts/release/process-release.ts +++ b/scripts/release/process-release.ts @@ -3,6 +3,7 @@ import fsp from 'fs/promises'; import dotenv from 'dotenv'; import execa from 'execa'; +import semver from 'semver'; import openapitools from '../../openapitools.json'; import { @@ -55,11 +56,17 @@ export function getVersionsToRelease(issueBody: string): VersionsToRelease { getMarkdownSection(issueBody, TEXT.versionChangeHeader) .split('\n') .forEach((line) => { - const result = line.match(/- \[x\] (.+): v(.+) -> v(.+)/); + const result = line.match(/- \[x\] (.+): v(.+) -> `(.+)`/); if (!result) { return; } - const [, lang, current, next] = result; + const [, lang, current, releaseType] = result; + const next = semver.inc(current, releaseType as semver.ReleaseType); + if (!next) { + throw new Error( + `Failed to increase version ${current} in ${releaseType}.` + ); + } versionsToRelease[lang] = { current, next, @@ -74,7 +81,7 @@ export function getLangsToUpdateRepo(issueBody: string): string[] { return getMarkdownSection(issueBody, TEXT.versionChangeHeader) .split('\n') .map((line) => { - const result = line.match(/- \[ \] (.+): v(.+) -> v(.+)/); + const result = line.match(/- \[ \] (.+): v(.+) -> `(.+)`/); return result?.[1]; }) .filter(Boolean) as string[]; diff --git a/scripts/release/text.ts b/scripts/release/text.ts index 4a2a2d6b40..c6f2d9ee89 100644 --- a/scripts/release/text.ts +++ b/scripts/release/text.ts @@ -11,6 +11,23 @@ export default { `**Un-checked** → Update repository.`, `**Line removed** → Do nothing.`, ].join('\n'), + indenpendentVersioning: ` + + The JavaScript repository consists of several packages with independent versioning. Release type is applied to each version. + +
+ For example, if the release type is \`patch\`, + + * \`algoliasearch\`@5.0.0 -> 5.0.1 + * \`@algolia/client-search\`@5.0.0 -> 5.0.1 + * \`@algolia/client-abtesting\`@5.0.0 -> 5.0.1 + * ... + * \`@algolia/client-predict\`@0.0.1 -> 0.0.2 + * ... + * \`@algolia/requester-browser-xhr\`@0.0.5 -> 0.0.6. +
+
+ `, descriptionForSkippedLang: ` - No \`feat\` or \`fix\` commit, thus unchecked by default.`, changelogHeader: `## CHANGELOG`, From b817d9ce35c86089a129f826a8087f6123186dbc Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Mon, 14 Mar 2022 11:00:29 +0100 Subject: [PATCH 03/16] chore(ci): support independent versioning --- config/release.config.json | 5 +++ scripts/common.ts | 5 +++ scripts/release/common.ts | 1 + scripts/release/create-release-issue.ts | 29 ++++++++------- scripts/release/process-release.ts | 48 +++++++++++++++++-------- 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/config/release.config.json b/config/release.config.json index 153e66e04e..138a65d414 100644 --- a/config/release.config.json +++ b/config/release.config.json @@ -9,6 +9,11 @@ "java": "next" }, "defaultTargetBranch": "next", + "mainGenerator": { + "javascript": "javascript-search", + "java": "java-search", + "php": "php-search" + }, "gitAuthor": { "name": "api-clients-bot", "email": "bot@algolia.com" diff --git a/scripts/common.ts b/scripts/common.ts index f2a0dda131..71dab7db79 100644 --- a/scripts/common.ts +++ b/scripts/common.ts @@ -39,6 +39,11 @@ Object.entries(openapitools['generator-cli'].generators).forEach( } ); +export function getPackageVersion(generator: string): string { + return openapitools['generator-cli'].generators[generator] + .additionalProperties.packageVersion; +} + export const LANGUAGES = [ ...new Set(Object.values(GENERATORS).map((gen) => gen.language)), ]; diff --git a/scripts/release/common.ts b/scripts/release/common.ts index 512159f826..e24cbca370 100644 --- a/scripts/release/common.ts +++ b/scripts/release/common.ts @@ -4,6 +4,7 @@ export const RELEASED_TAG = config.releasedTag; export const MAIN_BRANCH = config.mainBranch; export const OWNER = config.owner; export const REPO = config.repo; +export const MAIN_GENERATOR = config.mainGenerator; export function getTargetBranch(language: string): string { return config.targetBranch[language] || config.defaultTargetBranch; diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index 110537c673..db5dffa678 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -4,9 +4,15 @@ import dotenv from 'dotenv'; import semver from 'semver'; import type { ReleaseType } from 'semver'; -import { GENERATORS, LANGUAGES, ROOT_ENV_PATH, run } from '../common'; - -import { RELEASED_TAG, MAIN_BRANCH, OWNER, REPO } from './common'; +import { LANGUAGES, ROOT_ENV_PATH, run, getPackageVersion } from '../common'; + +import { + RELEASED_TAG, + MAIN_BRANCH, + OWNER, + REPO, + MAIN_GENERATOR, +} from './common'; import TEXT from './text'; dotenv.config({ path: ROOT_ENV_PATH }); @@ -27,16 +33,13 @@ type VersionsWithoutReleaseType = { }; function readVersions(): VersionsWithoutReleaseType { - const versions: VersionsWithoutReleaseType = {}; - - Object.values(GENERATORS).forEach((gen) => { - if (!versions[gen.language]) { - versions[gen.language] = { - current: gen.additionalProperties?.packageVersion, - }; - } - }); - return versions; + return Object.keys(MAIN_GENERATOR).reduce((acc, lang) => { + // eslint-disable-next-line no-param-reassign + acc[lang] = { + current: getPackageVersion(lang), + }; + return acc; + }, {}); } export function getVersionChangesText(versions: Versions): string { diff --git a/scripts/release/process-release.ts b/scripts/release/process-release.ts index a4669d4590..e161e8c08c 100755 --- a/scripts/release/process-release.ts +++ b/scripts/release/process-release.ts @@ -4,6 +4,7 @@ import fsp from 'fs/promises'; import dotenv from 'dotenv'; import execa from 'execa'; import semver from 'semver'; +import type { ReleaseType } from 'semver'; import openapitools from '../../openapitools.json'; import { @@ -27,6 +28,17 @@ import TEXT from './text'; dotenv.config({ path: ROOT_ENV_PATH }); +type BeforeCommitCommand = (params: { + releaseType: ReleaseType; + tempGitDir: string; +}) => Promise; + +const BEFORE_RELEASE_COMMIT: { [lang: string]: BeforeCommitCommand } = { + javascript: async ({ releaseType, tempGitDir }) => { + await run(`yarn release:bump_non_gen ${releaseType}`, { cwd: tempGitDir }); + }, +}; + function getIssueBody(): string { return JSON.parse( execa.sync('curl', [ @@ -40,7 +52,7 @@ function getIssueBody(): string { type VersionsToRelease = { [lang: string]: { current: string; - next: string; + releaseType: ReleaseType; dateStamp: string; }; }; @@ -61,15 +73,9 @@ export function getVersionsToRelease(issueBody: string): VersionsToRelease { return; } const [, lang, current, releaseType] = result; - const next = semver.inc(current, releaseType as semver.ReleaseType); - if (!next) { - throw new Error( - `Failed to increase version ${current} in ${releaseType}.` - ); - } versionsToRelease[lang] = { current, - next, + releaseType: releaseType as ReleaseType, dateStamp, }; }); @@ -93,9 +99,19 @@ async function updateOpenApiTools( Object.keys(openapitools['generator-cli'].generators).forEach((client) => { const lang = client.split('-')[0]; if (versionsToRelease[lang]) { - openapitools['generator-cli'].generators[ - client - ].additionalProperties.packageVersion = versionsToRelease[lang].next; + const additionalProperties = + openapitools['generator-cli'].generators[client].additionalProperties; + + const newVersion = semver.inc( + additionalProperties.packageVersion, + versionsToRelease[lang].releaseType + ); + if (!newVersion) { + throw new Error( + `Failed to bump version ${additionalProperties.packageVersion} by ${versionsToRelease[lang].releaseType}.` + ); + } + additionalProperties.packageVersion = newVersion; } }); await fsp.writeFile( @@ -153,8 +169,8 @@ async function processRelease(): Promise { console.log(`Generating ${lang} client(s)...`); console.log(await run(`yarn cli generate ${lang}`)); - const { current, next, dateStamp } = versionsToRelease[lang]; - + const { current, releaseType, dateStamp } = versionsToRelease[lang]; + const next = semver.inc(current, releaseType); // update changelog const changelogPath = toAbsolutePath( `${getLanguageFolder(lang)}/CHANGELOG.md` @@ -194,9 +210,13 @@ async function processRelease(): Promise { await configureGitHubAuthor(tempGitDir); await run(`git add .`, { cwd: tempGitDir }); - const { next, dateStamp } = versionsToRelease[lang]; + const { current, dateStamp, releaseType } = versionsToRelease[lang]; + const next = semver.inc(current, releaseType); if (willReleaseLibrary(lang)) { + // TODO: most of generated clients already have the new versions in package.json + // how can I avoid double-bump versions??? + await BEFORE_RELEASE_COMMIT[lang]?.({ releaseType, tempGitDir }); await execa('git', ['commit', '-m', `chore: release ${next}`], { cwd: tempGitDir, }); From 2937162228f18546e1adc35dfe7a901b5a57d565 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Tue, 15 Mar 2022 10:09:14 +0100 Subject: [PATCH 04/16] chore: fix version bumping --- scripts/release/process-release.ts | 109 ++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 35 deletions(-) diff --git a/scripts/release/process-release.ts b/scripts/release/process-release.ts index e161e8c08c..8e9461f11d 100755 --- a/scripts/release/process-release.ts +++ b/scripts/release/process-release.ts @@ -28,14 +28,16 @@ import TEXT from './text'; dotenv.config({ path: ROOT_ENV_PATH }); -type BeforeCommitCommand = (params: { +type BeforeClientGenerationCommand = (params: { releaseType: ReleaseType; - tempGitDir: string; + dir: string; }) => Promise; -const BEFORE_RELEASE_COMMIT: { [lang: string]: BeforeCommitCommand } = { - javascript: async ({ releaseType, tempGitDir }) => { - await run(`yarn release:bump_non_gen ${releaseType}`, { cwd: tempGitDir }); +const BEFORE_CLIENT_GENERATION: { + [lang: string]: BeforeClientGenerationCommand; +} = { + javascript: async ({ releaseType, dir }) => { + await run(`yarn release:bump ${releaseType}`, { cwd: dir }); }, }; @@ -73,6 +75,11 @@ export function getVersionsToRelease(issueBody: string): VersionsToRelease { return; } const [, lang, current, releaseType] = result; + if (!['major', 'minor', 'patch', 'prerelease'].includes(releaseType)) { + throw new Error( + `\`${releaseType}\` is unknown release type. Allowed: major, minor, patch, prerelease` + ); + } versionsToRelease[lang] = { current, releaseType: releaseType as ReleaseType, @@ -127,6 +134,40 @@ async function configureGitHubAuthor(cwd?: string): Promise { }); } +async function updateChangelog({ + lang, + issueBody, + current, + next, + dateStamp, + willReleaseLibrary, +}: { + lang: string; + issueBody: string; + current: string; + next: string; + dateStamp: string; + willReleaseLibrary: boolean; +}): Promise { + const changelogPath = toAbsolutePath( + `${getLanguageFolder(lang)}/CHANGELOG.md` + ); + const existingContent = (await exists(changelogPath)) + ? (await fsp.readFile(changelogPath)).toString() + : ''; + const changelogHeader = willReleaseLibrary + ? `## [v${next}](${getGitHubUrl(lang)}/compare/v${current}...v${next})` + : `## ${dateStamp}`; + const newChangelog = getMarkdownSection( + getMarkdownSection(issueBody, TEXT.changelogHeader), + `### ${lang}` + ); + await fsp.writeFile( + changelogPath, + [changelogHeader, newChangelog, existingContent].join('\n\n') + ); +} + async function processRelease(): Promise { if (!process.env.GITHUB_TOKEN) { throw new Error('Environment variable `GITHUB_TOKEN` does not exist.'); @@ -151,11 +192,6 @@ async function processRelease(): Promise { await updateOpenApiTools(versionsToRelease); - await configureGitHubAuthor(); - - // commit openapitools and changelogs - await run('git add openapitools.json'); - const langsToReleaseOrUpdate = [ ...Object.keys(versionsToRelease), ...langsToUpdateRepo, @@ -165,32 +201,36 @@ async function processRelease(): Promise { Boolean(versionsToRelease[lang]); for (const lang of langsToReleaseOrUpdate) { - // prepare the submodule + const { current, releaseType, dateStamp } = versionsToRelease[lang]; + /* + About bumping versions of JS clients: + + There are generated clients in JS repo, and non-generated clients like `algoliasearch`, `client-common`, etc. + Now that the versions of generated clients are updated in `openapitools.json`, + the generation output will have correct new versions. + + However, we need to manually update versions of the non-generated (a.k.a. manually written) clients. + In order to do that, we run `yarn release:bump ` in this monorepo first. + It will update the versions of the non-generated clients which exists in this monorepo. + After that, we generate clients with new versions. And then, we copy all of them over to JS repository. + */ + await BEFORE_CLIENT_GENERATION[lang]?.({ + releaseType, + dir: toAbsolutePath(getLanguageFolder(lang)), + }); + console.log(`Generating ${lang} client(s)...`); console.log(await run(`yarn cli generate ${lang}`)); - const { current, releaseType, dateStamp } = versionsToRelease[lang]; const next = semver.inc(current, releaseType); - // update changelog - const changelogPath = toAbsolutePath( - `${getLanguageFolder(lang)}/CHANGELOG.md` - ); - const existingContent = (await exists(changelogPath)) - ? (await fsp.readFile(changelogPath)).toString() - : ''; - const changelogHeader = willReleaseLibrary(lang) - ? `## [v${next}](${getGitHubUrl(lang)}/compare/v${current}...v${next})` - : `## ${dateStamp}`; - const newChangelog = getMarkdownSection( - getMarkdownSection(issueBody, TEXT.changelogHeader), - `### ${lang}` - ); - await fsp.writeFile( - changelogPath, - [changelogHeader, newChangelog, existingContent].join('\n\n') - ); - - await run(`git add ${changelogPath}`); + await updateChangelog({ + lang, + issueBody, + current, + next: next!, + dateStamp, + willReleaseLibrary: willReleaseLibrary(lang), + }); } // We push commits from submodules AFTER all the generations are done. @@ -214,9 +254,6 @@ async function processRelease(): Promise { const next = semver.inc(current, releaseType); if (willReleaseLibrary(lang)) { - // TODO: most of generated clients already have the new versions in package.json - // how can I avoid double-bump versions??? - await BEFORE_RELEASE_COMMIT[lang]?.({ releaseType, tempGitDir }); await execa('git', ['commit', '-m', `chore: release ${next}`], { cwd: tempGitDir, }); @@ -233,6 +270,8 @@ async function processRelease(): Promise { } // Commit and push from the monorepo level. + await configureGitHubAuthor(); + await run(`git add .`); await execa('git', ['commit', '-m', `chore: release ${getDateStamp()}`]); await run(`git push`); From 6e0aebf38dd7883d7fabfd3886bd4d7519fd61f8 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Tue, 15 Mar 2022 10:20:15 +0100 Subject: [PATCH 05/16] chore: fix test cases --- scripts/release/__tests__/process-release.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/release/__tests__/process-release.test.ts b/scripts/release/__tests__/process-release.test.ts index e1597e21cb..1357bcbe52 100644 --- a/scripts/release/__tests__/process-release.test.ts +++ b/scripts/release/__tests__/process-release.test.ts @@ -12,9 +12,9 @@ describe('process release', () => { expect(Object.keys(versions)).toEqual(['javascript', 'php']); expect(versions.javascript.current).toEqual('1.0.0'); - expect(versions.javascript.next).toEqual('1.1.0'); + expect(versions.javascript.releaseType).toEqual('minor'); expect(versions.php.current).toEqual('2.0.0'); - expect(versions.php.next).toEqual('2.0.1'); + expect(versions.php.releaseType).toEqual('patch'); }); it('gets langs to update', () => { From e778120181d383722614d9eba4e1d4b2c80d4f44 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Tue, 15 Mar 2022 11:16:34 +0100 Subject: [PATCH 06/16] chore: add more test --- .../release/__tests__/process-release.test.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/scripts/release/__tests__/process-release.test.ts b/scripts/release/__tests__/process-release.test.ts index 1357bcbe52..d910f9d30b 100644 --- a/scripts/release/__tests__/process-release.test.ts +++ b/scripts/release/__tests__/process-release.test.ts @@ -1,4 +1,6 @@ +import { getVersionChangesText } from '../create-release-issue'; import { getVersionsToRelease, getLangsToUpdateRepo } from '../process-release'; +import TEXT from '../text'; describe('process release', () => { it('gets versions to release', () => { @@ -28,4 +30,33 @@ describe('process release', () => { `) ).toEqual(['javascript', 'java']); }); + + it('parses parses issue body correctly', () => { + // This test is a glue between create-release-issue and process-release. + const issueBody = [ + TEXT.versionChangeHeader, + getVersionChangesText({ + javascript: { + current: '0.0.1', + releaseType: 'patch', + }, + php: { + current: '0.0.1', + releaseType: 'minor', + }, + java: { + current: '0.0.1', + releaseType: 'patch', + skipRelease: true, + }, + }), + ].join('\n'); + + const versions = getVersionsToRelease(issueBody); + expect(Object.keys(versions)).toEqual(['javascript', 'php']); + expect(versions.javascript.current).toEqual('0.0.1'); + expect(versions.javascript.releaseType).toEqual('patch'); + expect(versions.php.current).toEqual('0.0.1'); + expect(versions.php.releaseType).toEqual('minor'); + }); }); From 99c6462668f3ec7ddd8688ee08ede74e1f3cdb11 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Thu, 17 Mar 2022 11:15:13 +0100 Subject: [PATCH 07/16] chore: move mainGenerator to clients.config.json --- config/clients.config.json | 5 ++++- config/release.config.json | 5 ----- scripts/release/common.ts | 10 +++++++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/config/clients.config.json b/config/clients.config.json index 06e736304c..8940a1a2f7 100644 --- a/config/clients.config.json +++ b/config/clients.config.json @@ -1,6 +1,7 @@ { "java": { "folder": "clients/algoliasearch-client-java-2", + "mainGenerator": "javascript-search", "tests": { "extension": ".test.java", "outputFolder": "src/test/java/com/algolia" @@ -8,12 +9,14 @@ }, "javascript": { "folder": "clients/algoliasearch-client-javascript", + "mainGenerator": "java-search", "tests": { "extension": ".test.ts", "outputFolder": "src" } }, "php": { - "folder": "clients/algoliasearch-client-php" + "folder": "clients/algoliasearch-client-php", + "mainGenerator": "php-search" } } diff --git a/config/release.config.json b/config/release.config.json index 138a65d414..153e66e04e 100644 --- a/config/release.config.json +++ b/config/release.config.json @@ -9,11 +9,6 @@ "java": "next" }, "defaultTargetBranch": "next", - "mainGenerator": { - "javascript": "javascript-search", - "java": "java-search", - "php": "php-search" - }, "gitAuthor": { "name": "api-clients-bot", "email": "bot@algolia.com" diff --git a/scripts/release/common.ts b/scripts/release/common.ts index 849b9c8dda..9eceddea91 100644 --- a/scripts/release/common.ts +++ b/scripts/release/common.ts @@ -1,3 +1,4 @@ +import clientsConfig from '../../config/clients.config.json'; import config from '../../config/release.config.json'; import { run } from '../common'; @@ -5,7 +6,14 @@ export const RELEASED_TAG = config.releasedTag; export const MAIN_BRANCH = config.mainBranch; export const OWNER = config.owner; export const REPO = config.repo; -export const MAIN_GENERATOR = config.mainGenerator; +export const MAIN_GENERATOR = Object.keys(clientsConfig).reduce( + (acc: { [lang: string]: string }, lang: string) => { + // eslint-disable-next-line no-param-reassign + acc[lang] = clientsConfig[lang].mainGenerator; + return acc; + }, + {} +); export function getTargetBranch(language: string): string { return config.targetBranch[language] || config.defaultTargetBranch; From eb511748295636c56f18a27e556363fcc2cb2a22 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Thu, 17 Mar 2022 11:17:11 +0100 Subject: [PATCH 08/16] chore: clean up code --- scripts/common.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/common.ts b/scripts/common.ts index 71dab7db79..e5a990511f 100644 --- a/scripts/common.ts +++ b/scripts/common.ts @@ -40,8 +40,7 @@ Object.entries(openapitools['generator-cli'].generators).forEach( ); export function getPackageVersion(generator: string): string { - return openapitools['generator-cli'].generators[generator] - .additionalProperties.packageVersion; + return GENERATORS[generator].additionalProperties.packageVersion; } export const LANGUAGES = [ From acc7b408015c5bab4ebb276a18e5ca201006dead Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Thu, 17 Mar 2022 11:20:48 +0100 Subject: [PATCH 09/16] chore: rename variables --- scripts/release/common.ts | 6 +- scripts/release/create-release-issue.ts | 91 +++++++++++++------------ 2 files changed, 50 insertions(+), 47 deletions(-) diff --git a/scripts/release/common.ts b/scripts/release/common.ts index 9eceddea91..da83dd294c 100644 --- a/scripts/release/common.ts +++ b/scripts/release/common.ts @@ -7,10 +7,10 @@ export const MAIN_BRANCH = config.mainBranch; export const OWNER = config.owner; export const REPO = config.repo; export const MAIN_GENERATOR = Object.keys(clientsConfig).reduce( - (acc: { [lang: string]: string }, lang: string) => { + (mainGenerator: { [lang: string]: string }, lang: string) => { // eslint-disable-next-line no-param-reassign - acc[lang] = clientsConfig[lang].mainGenerator; - return acc; + mainGenerator[lang] = clientsConfig[lang].mainGenerator; + return mainGenerator; }, {} ); diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index db5dffa678..360424fefa 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -113,56 +113,59 @@ export function decideReleaseStrategy({ versions: VersionsWithoutReleaseType; commits: PassedCommit[]; }): Versions { - return Object.entries(versions).reduce((acc: Versions, [lang, version]) => { - const commitsPerLang = commits.filter((commit) => commit.lang === lang); - const currentVersion = versions[lang].current; + return Object.entries(versions).reduce( + (versionsWithReleaseType: Versions, [lang, version]) => { + const commitsPerLang = commits.filter((commit) => commit.lang === lang); + const currentVersion = versions[lang].current; + + if (commitsPerLang.length === 0) { + versionsWithReleaseType[lang] = { + ...version, + noCommit: true, + releaseType: null, + }; + return versionsWithReleaseType; + } - if (commitsPerLang.length === 0) { - acc[lang] = { - ...version, - noCommit: true, - releaseType: null, - }; - return acc; - } + if (semver.prerelease(currentVersion)) { + // if version is like 0.1.2-beta.1, it increases to 0.1.2-beta.2, even if there's a breaking change. + versionsWithReleaseType[lang] = { + ...version, + releaseType: 'prerelease', + }; + return versionsWithReleaseType; + } - if (semver.prerelease(currentVersion)) { - // if version is like 0.1.2-beta.1, it increases to 0.1.2-beta.2, even if there's a breaking change. - acc[lang] = { - ...version, - releaseType: 'prerelease', - }; - return acc; - } + if ( + commitsPerLang.some((commit) => + commit.message.includes('BREAKING CHANGE') + ) + ) { + versionsWithReleaseType[lang] = { + ...version, + releaseType: 'major', + }; + return versionsWithReleaseType; + } - if ( - commitsPerLang.some((commit) => - commit.message.includes('BREAKING CHANGE') - ) - ) { - acc[lang] = { - ...version, - releaseType: 'major', - }; - return acc; - } + const commitTypes = new Set(commitsPerLang.map(({ type }) => type)); + if (commitTypes.has('feat')) { + versionsWithReleaseType[lang] = { + ...version, + releaseType: 'minor', + }; + return versionsWithReleaseType; + } - const commitTypes = new Set(commitsPerLang.map(({ type }) => type)); - if (commitTypes.has('feat')) { - acc[lang] = { + versionsWithReleaseType[lang] = { ...version, - releaseType: 'minor', + releaseType: 'patch', + ...(commitTypes.has('fix') ? undefined : { skipRelease: true }), }; - return acc; - } - - acc[lang] = { - ...version, - releaseType: 'patch', - ...(commitTypes.has('fix') ? undefined : { skipRelease: true }), - }; - return acc; - }, {}); + return versionsWithReleaseType; + }, + {} + ); } /* eslint-enable no-param-reassign */ From cc0707fa1cd21dd66b9a8f47836482d13e712d3b Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Thu, 17 Mar 2022 11:24:13 +0100 Subject: [PATCH 10/16] chore: extract types to types.ts --- scripts/release/create-release-issue.ts | 35 ++++------------------- scripts/release/process-release.ts | 9 +----- scripts/release/types.ts | 37 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 37 deletions(-) create mode 100644 scripts/release/types.ts diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index 360424fefa..cb65dc2891 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -2,7 +2,6 @@ import { Octokit } from '@octokit/rest'; import dotenv from 'dotenv'; import semver from 'semver'; -import type { ReleaseType } from 'semver'; import { LANGUAGES, ROOT_ENV_PATH, run, getPackageVersion } from '../common'; @@ -14,24 +13,15 @@ import { MAIN_GENERATOR, } from './common'; import TEXT from './text'; +import type { + Versions, + VersionsWithoutReleaseType, + PassedCommit, + Commit, +} from './types'; dotenv.config({ path: ROOT_ENV_PATH }); -type Version = { - current: string; - releaseType: ReleaseType | null; - skipRelease?: boolean; - noCommit?: boolean; -}; - -type Versions = { - [lang: string]: Version; -}; - -type VersionsWithoutReleaseType = { - [lang: string]: Omit; -}; - function readVersions(): VersionsWithoutReleaseType { return Object.keys(MAIN_GENERATOR).reduce((acc, lang) => { // eslint-disable-next-line no-param-reassign @@ -65,19 +55,6 @@ export function getVersionChangesText(versions: Versions): string { }).join('\n'); } -type PassedCommit = { - hash: string; - type: string; - lang: string; - message: string; - raw: string; -}; - -type Commit = - | PassedCommit - | { error: 'missing-language-scope' } - | { error: 'unknown-language-scope' }; - export function parseCommit(commit: string): Commit { const hash = commit.slice(0, 7); let message = commit.slice(8); diff --git a/scripts/release/process-release.ts b/scripts/release/process-release.ts index e68a12f97e..54842b86a0 100755 --- a/scripts/release/process-release.ts +++ b/scripts/release/process-release.ts @@ -25,6 +25,7 @@ import { configureGitHubAuthor, } from './common'; import TEXT from './text'; +import type { VersionsToRelease } from './types'; dotenv.config({ path: ROOT_ENV_PATH }); @@ -51,14 +52,6 @@ function getIssueBody(): string { ).body; } -type VersionsToRelease = { - [lang: string]: { - current: string; - releaseType: ReleaseType; - dateStamp: string; - }; -}; - function getDateStamp(): string { return new Date().toISOString().split('T')[0]; } diff --git a/scripts/release/types.ts b/scripts/release/types.ts new file mode 100644 index 0000000000..33d7f92867 --- /dev/null +++ b/scripts/release/types.ts @@ -0,0 +1,37 @@ +import type { ReleaseType } from 'semver'; + +export type Version = { + current: string; + releaseType: ReleaseType | null; + skipRelease?: boolean; + noCommit?: boolean; +}; + +export type Versions = { + [lang: string]: Version; +}; + +export type VersionsWithoutReleaseType = { + [lang: string]: Omit; +}; + +export type PassedCommit = { + hash: string; + type: string; + lang: string; + message: string; + raw: string; +}; + +export type Commit = + | PassedCommit + | { error: 'missing-language-scope' } + | { error: 'unknown-language-scope' }; + +export type VersionsToRelease = { + [lang: string]: { + current: string; + releaseType: ReleaseType; + dateStamp: string; + }; +}; From 383a43777c2e15b15cc9ea3c5aee1ea472d46788 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Mon, 21 Mar 2022 11:50:34 +0100 Subject: [PATCH 11/16] Update scripts/release/__tests__/process-release.test.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Clément Vannicatte <20689156+shortcuts@users.noreply.github.com> --- scripts/release/__tests__/process-release.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release/__tests__/process-release.test.ts b/scripts/release/__tests__/process-release.test.ts index d910f9d30b..ef2a77ee08 100644 --- a/scripts/release/__tests__/process-release.test.ts +++ b/scripts/release/__tests__/process-release.test.ts @@ -31,7 +31,7 @@ describe('process release', () => { ).toEqual(['javascript', 'java']); }); - it('parses parses issue body correctly', () => { + it('parses issue body correctly', () => { // This test is a glue between create-release-issue and process-release. const issueBody = [ TEXT.versionChangeHeader, From 0975dfe99fa693a71bafe1e3cd70516401bd4eaf Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Mon, 21 Mar 2022 12:00:28 +0100 Subject: [PATCH 12/16] chore: update types --- scripts/release/create-release-issue.ts | 3 ++- scripts/release/types.ts | 4 +++- scripts/types.ts | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index cb65dc2891..343c336d54 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -4,6 +4,7 @@ import dotenv from 'dotenv'; import semver from 'semver'; import { LANGUAGES, ROOT_ENV_PATH, run, getPackageVersion } from '../common'; +import type { Language } from '../types'; import { RELEASED_TAG, @@ -67,7 +68,7 @@ export function parseCommit(commit: string): Commit { } message = message.slice(message.indexOf(':') + 1).trim(); type = matchResult[1]; - const lang = matchResult[2]; + const lang = matchResult[2] as Language; if (!LANGUAGES.includes(lang)) { return { error: 'unknown-language-scope' }; diff --git a/scripts/release/types.ts b/scripts/release/types.ts index 33d7f92867..f05a7bd9da 100644 --- a/scripts/release/types.ts +++ b/scripts/release/types.ts @@ -1,5 +1,7 @@ import type { ReleaseType } from 'semver'; +import type { Language } from '../types'; + export type Version = { current: string; releaseType: ReleaseType | null; @@ -18,7 +20,7 @@ export type VersionsWithoutReleaseType = { export type PassedCommit = { hash: string; type: string; - lang: string; + lang: Language; message: string; raw: string; }; diff --git a/scripts/types.ts b/scripts/types.ts index 22a7720e73..3b2382a58e 100644 --- a/scripts/types.ts +++ b/scripts/types.ts @@ -1,3 +1,5 @@ +import type config from '../config/clients.config.json'; + export type Generator = Record & { language: string; client: string; @@ -13,3 +15,5 @@ export type RunOptions = { verbose?: boolean; cwd?: string; }; + +export type Language = keyof typeof config; From bb942afe06437f54b8a6c975bb119eacfcac08b6 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Mon, 21 Mar 2022 12:00:45 +0100 Subject: [PATCH 13/16] chore: update test --- scripts/release/__tests__/process-release.test.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/release/__tests__/process-release.test.ts b/scripts/release/__tests__/process-release.test.ts index ef2a77ee08..066d3a1e0f 100644 --- a/scripts/release/__tests__/process-release.test.ts +++ b/scripts/release/__tests__/process-release.test.ts @@ -53,10 +53,15 @@ describe('process release', () => { ].join('\n'); const versions = getVersionsToRelease(issueBody); - expect(Object.keys(versions)).toEqual(['javascript', 'php']); - expect(versions.javascript.current).toEqual('0.0.1'); - expect(versions.javascript.releaseType).toEqual('patch'); - expect(versions.php.current).toEqual('0.0.1'); - expect(versions.php.releaseType).toEqual('minor'); + expect(versions).toEqual({ + javascript: expect.objectContaining({ + current: '0.0.1', + releaseType: 'patch', + }), + php: expect.objectContaining({ + current: '0.0.1', + releaseType: 'minor', + }), + }); }); }); From d16ff92b8fc9db5797e070f064c72dbb03a43ef2 Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Tue, 22 Mar 2022 10:12:04 +0100 Subject: [PATCH 14/16] chore: fix broken config --- config/clients.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/clients.config.json b/config/clients.config.json index 2e64e02674..2c3fbb3659 100644 --- a/config/clients.config.json +++ b/config/clients.config.json @@ -20,7 +20,7 @@ }, "php": { "folder": "clients/algoliasearch-client-php", - "mainGenerator": "php-search" + "mainGenerator": "php-search", "modelFolder": "lib/Model" } } From 29e3bee3b6975e3c68e13d0ad2aca54c2780a31d Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Tue, 22 Mar 2022 15:09:43 +0100 Subject: [PATCH 15/16] chore: avoid eslint error --- scripts/release/common.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/release/common.ts b/scripts/release/common.ts index 2be9d59b50..63ae2a586f 100644 --- a/scripts/release/common.ts +++ b/scripts/release/common.ts @@ -8,9 +8,10 @@ export const OWNER = config.owner; export const REPO = config.repo; export const MAIN_GENERATOR = Object.keys(clientsConfig).reduce( (mainGenerator: { [lang: string]: string }, lang: string) => { - // eslint-disable-next-line no-param-reassign - mainGenerator[lang] = clientsConfig[lang].mainGenerator; - return mainGenerator; + return { + ...mainGenerator, + [lang]: clientsConfig[lang].mainGenerator, + }; }, {} ); From 69a1db1d80e7b940f3deb593b83d454e4599deca Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Tue, 22 Mar 2022 15:18:49 +0100 Subject: [PATCH 16/16] chore: avoid eslint error --- scripts/release/create-release-issue.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/release/create-release-issue.ts b/scripts/release/create-release-issue.ts index 343c336d54..116809fae0 100755 --- a/scripts/release/create-release-issue.ts +++ b/scripts/release/create-release-issue.ts @@ -25,11 +25,12 @@ dotenv.config({ path: ROOT_ENV_PATH }); function readVersions(): VersionsWithoutReleaseType { return Object.keys(MAIN_GENERATOR).reduce((acc, lang) => { - // eslint-disable-next-line no-param-reassign - acc[lang] = { - current: getPackageVersion(lang), + return { + ...acc, + [lang]: { + current: getPackageVersion(lang), + }, }; - return acc; }, {}); }