@ckeditor/ckeditor5-dev-release-tools 43.0.0 → 44.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/index.js +23 -52
  2. package/lib/tasks/cleanuppackages.js +5 -7
  3. package/lib/tasks/commitandtag.js +7 -7
  4. package/lib/tasks/creategithubrelease.js +6 -6
  5. package/lib/tasks/generatechangelogformonorepository.js +37 -37
  6. package/lib/tasks/generatechangelogforsinglepackage.js +29 -28
  7. package/lib/tasks/preparerepository.js +11 -12
  8. package/lib/tasks/publishpackages.js +10 -12
  9. package/lib/tasks/push.js +4 -6
  10. package/lib/tasks/reassignnpmtags.js +11 -13
  11. package/lib/tasks/updatedependencies.js +5 -7
  12. package/lib/tasks/updateversions.js +8 -8
  13. package/lib/tasks/verifypackagespublishedcorrectly.js +6 -8
  14. package/lib/utils/abortcontroller.js +2 -11
  15. package/lib/utils/assertfilestopublish.js +5 -7
  16. package/lib/utils/assertnpmauthorization.js +3 -5
  17. package/lib/utils/assertnpmtag.js +5 -7
  18. package/lib/utils/assertpackages.js +4 -6
  19. package/lib/utils/checkversionavailability.js +4 -6
  20. package/lib/utils/configurereleaseoptions.js +43 -0
  21. package/lib/utils/confirmincludingpackage.js +24 -0
  22. package/lib/utils/confirmnpmtag.js +32 -0
  23. package/lib/utils/constants.js +26 -0
  24. package/lib/utils/displaycommits.js +9 -11
  25. package/lib/utils/displayskippedpackages.js +7 -9
  26. package/lib/utils/executeinparallel.js +13 -14
  27. package/lib/utils/generatechangelog.js +5 -7
  28. package/lib/utils/getchangedfilesforcommit.js +3 -5
  29. package/lib/utils/getchangelog.js +22 -0
  30. package/lib/utils/getchangesforversion.js +28 -0
  31. package/lib/utils/getcommits.js +8 -10
  32. package/lib/utils/getformatteddate.js +13 -0
  33. package/lib/utils/getnewversiontype.js +2 -4
  34. package/lib/utils/getnpmtagfromversion.js +3 -5
  35. package/lib/utils/getpackagejson.js +4 -6
  36. package/lib/utils/getpackagespaths.js +7 -9
  37. package/lib/utils/getwriteroptions.js +9 -6
  38. package/lib/utils/isversionpublishablefortag.js +5 -5
  39. package/lib/utils/{parallelworker.cjs → parallelworker.js} +3 -4
  40. package/lib/utils/parseroptions.js +1 -3
  41. package/lib/utils/providenewversionformonorepository.js +51 -0
  42. package/lib/utils/providetoken.js +26 -0
  43. package/lib/utils/provideversion.js +98 -0
  44. package/lib/utils/publishpackageonnpmcallback.js +10 -12
  45. package/lib/utils/savechangelog.js +18 -0
  46. package/lib/utils/transformcommitfactory.js +6 -6
  47. package/lib/utils/transformcommitutils.js +142 -147
  48. package/lib/utils/truncatechangelog.js +42 -0
  49. package/lib/utils/validaterepositorytorelease.js +3 -5
  50. package/lib/utils/versions.js +122 -128
  51. package/package.json +3 -2
  52. package/lib/utils/changelog.js +0 -109
  53. package/lib/utils/cli.js +0 -349
@@ -1,109 +0,0 @@
1
- /**
2
- * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md.
4
- */
5
-
6
- 'use strict';
7
-
8
- const fs = require( 'fs' );
9
- const path = require( 'path' );
10
- const { format } = require( 'date-fns' );
11
- const { getRepositoryUrl } = require( './transformcommitutils' );
12
-
13
- const utils = {
14
- /**
15
- * Changelog file name.
16
- */
17
- changelogFile: 'CHANGELOG.md',
18
-
19
- /**
20
- * Changelog header.
21
- */
22
- changelogHeader: 'Changelog\n=========\n\n',
23
-
24
- /**
25
- * Retrieves changes from the changelog for the given version (tag).
26
- *
27
- * @param {String} version
28
- * @param {String} [cwd=process.cwd()] Where to look for the changelog file.
29
- * @returns {String|null}
30
- */
31
- getChangesForVersion( version, cwd = process.cwd() ) {
32
- version = version.replace( /^v/, '' );
33
-
34
- const changelog = utils.getChangelog( cwd ).replace( utils.changelogHeader, '\n' );
35
- const match = changelog.match( new RegExp( `\\n(## \\[?${ version }\\]?[\\s\\S]+?)(?:\\n## \\[?|$)` ) );
36
-
37
- if ( !match || !match[ 1 ] ) {
38
- return null;
39
- }
40
-
41
- return match[ 1 ].replace( /##[^\n]+\n/, '' ).trim();
42
- },
43
-
44
- /**
45
- * @param {String} [cwd=process.cwd()] Where to look for the changelog file.
46
- * @returns {String|null}
47
- */
48
- getChangelog( cwd = process.cwd() ) {
49
- const changelogFile = path.join( cwd, utils.changelogFile );
50
-
51
- if ( !fs.existsSync( changelogFile ) ) {
52
- return null;
53
- }
54
-
55
- return fs.readFileSync( changelogFile, 'utf-8' );
56
- },
57
-
58
- /**
59
- * @param {String} content
60
- * @param {String} [cwd=process.cwd()] Where to look for the changelog file.
61
- */
62
- saveChangelog( content, cwd = process.cwd() ) {
63
- const changelogFile = path.join( cwd, utils.changelogFile );
64
-
65
- fs.writeFileSync( changelogFile, content, 'utf-8' );
66
- },
67
-
68
- /**
69
- * @param {Number} length
70
- * @param {String} [cwd=process.cwd()] Where to look for the changelog file.
71
- */
72
- truncateChangelog( length, cwd = process.cwd() ) {
73
- const changelog = utils.getChangelog( cwd );
74
-
75
- if ( !changelog ) {
76
- return;
77
- }
78
-
79
- const entryHeader = '## [\\s\\S]+?';
80
- const entryHeaderRegexp = new RegExp( `\\n(${ entryHeader })(?=\\n${ entryHeader }|$)`, 'g' );
81
-
82
- const entries = [ ...changelog.matchAll( entryHeaderRegexp ) ]
83
- .filter( match => match && match[ 1 ] )
84
- .map( match => match[ 1 ] );
85
-
86
- if ( !entries.length ) {
87
- return;
88
- }
89
-
90
- const truncatedEntries = entries.slice( 0, length );
91
-
92
- const changelogFooter = entries.length > truncatedEntries.length ?
93
- `\n\n---\n\nTo see all releases, visit the [release page](${ getRepositoryUrl( cwd ) }/releases).\n` :
94
- '\n';
95
-
96
- const truncatedChangelog = utils.changelogHeader + truncatedEntries.join( '\n' ).trim() + changelogFooter;
97
-
98
- utils.saveChangelog( truncatedChangelog, cwd );
99
- },
100
-
101
- /**
102
- * @returns {String}
103
- */
104
- getFormattedDate() {
105
- return format( new Date(), 'yyyy-MM-dd' );
106
- }
107
- };
108
-
109
- module.exports = utils;
package/lib/utils/cli.js DELETED
@@ -1,349 +0,0 @@
1
- /**
2
- * @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md.
4
- */
5
-
6
- 'use strict';
7
-
8
- const inquirer = require( 'inquirer' );
9
- const semver = require( 'semver' );
10
- const chalk = require( 'chalk' );
11
-
12
- const QUESTION_MARK = chalk.cyan( '?' );
13
-
14
- const cli = {
15
- /**
16
- * A size of default indent for a log.
17
- */
18
- INDENT_SIZE: 3,
19
-
20
- /**
21
- * A size of indent for a second and next lines in a log. The number is equal to length of the log string:
22
- * '* 1234567 ', where '1234567' is a short commit id.
23
- * It does not include a value from `cli.INDENT_SIZE`.
24
- */
25
- COMMIT_INDENT_SIZE: 10,
26
-
27
- /**
28
- * Asks a user for a confirmation for updating and tagging versions of the packages.
29
- *
30
- * @param {Map} packages Packages to release.
31
- * @returns {Promise.<Boolean>}
32
- */
33
- confirmUpdatingVersions( packages ) {
34
- let message = 'Packages and their old and new versions:\n';
35
-
36
- for ( const packageName of Array.from( packages.keys() ).sort() ) {
37
- const packageDetails = packages.get( packageName );
38
-
39
- message += ` * "${ packageName }": v${ packageDetails.previousVersion } => v${ packageDetails.version }\n`;
40
- }
41
-
42
- message += 'Continue?';
43
-
44
- const confirmQuestion = {
45
- message,
46
- type: 'confirm',
47
- name: 'confirm',
48
- default: true
49
- };
50
-
51
- return inquirer.prompt( [ confirmQuestion ] )
52
- .then( answers => answers.confirm );
53
- },
54
-
55
- /**
56
- * Asks a user for a confirmation for publishing changes.
57
- *
58
- * @param {Map} packages Packages to release.
59
- * @returns {Promise.<Boolean>}
60
- */
61
- confirmPublishing( packages ) {
62
- let message = 'Services where the release will be created:\n';
63
-
64
- for ( const packageName of Array.from( packages.keys() ).sort() ) {
65
- const packageDetails = packages.get( packageName );
66
-
67
- let packageMessage = ` * "${ packageName }" - version: ${ packageDetails.version }`;
68
-
69
- const services = [];
70
-
71
- if ( packageDetails.shouldReleaseOnNpm ) {
72
- services.push( 'NPM' );
73
- }
74
-
75
- if ( packageDetails.shouldReleaseOnGithub ) {
76
- services.push( 'GitHub' );
77
- }
78
-
79
- let color;
80
-
81
- if ( services.length ) {
82
- color = chalk.magenta;
83
- packageMessage += ` - services: ${ services.join( ', ' ) } `;
84
- } else {
85
- color = chalk.gray;
86
- packageMessage += ' - nothing to release';
87
- }
88
-
89
- message += color( packageMessage ) + '\n';
90
- }
91
-
92
- message += 'Continue?';
93
-
94
- const confirmQuestion = {
95
- message,
96
- type: 'confirm',
97
- name: 'confirm',
98
- default: true
99
- };
100
-
101
- return inquirer.prompt( [ confirmQuestion ] )
102
- .then( answers => answers.confirm );
103
- },
104
-
105
- /**
106
- * Asks a user for a confirmation for removing archives created by `npm pack` command.
107
- *
108
- * @returns {Promise.<Boolean>}
109
- */
110
- confirmRemovingFiles() {
111
- const confirmQuestion = {
112
- message: 'Remove created archives?',
113
- type: 'confirm',
114
- name: 'confirm',
115
- default: true
116
- };
117
-
118
- return inquirer.prompt( [ confirmQuestion ] )
119
- .then( answers => answers.confirm );
120
- },
121
-
122
- /**
123
- * Asks a user for a confirmation for including a package that does not contain all required files.
124
- *
125
- * @returns {Promise.<Boolean>}
126
- */
127
- confirmIncludingPackage() {
128
- const confirmQuestion = {
129
- message: 'Package does not contain all required files to publish. Include this package in the release and continue?',
130
- type: 'confirm',
131
- name: 'confirm',
132
- default: true
133
- };
134
-
135
- return inquirer.prompt( [ confirmQuestion ] )
136
- .then( answers => answers.confirm );
137
- },
138
-
139
- /**
140
- * Asks a user for providing the new version.
141
- *
142
- * @param {String} packageVersion
143
- * @param {String|null} releaseTypeOrNewVersion
144
- * @param {Object} [options]
145
- * @param {Boolean} [options.disableInternalVersion=false] Whether to "internal" version is enabled.
146
- * @param {Boolean} [options.disableSkipVersion=false] Whether to "skip" version is enabled.
147
- * @param {Number} [options.indentLevel=0] The indent level.
148
- * @returns {Promise.<String>}
149
- */
150
- provideVersion( packageVersion, releaseTypeOrNewVersion, options = {} ) {
151
- const indentLevel = options.indentLevel || 0;
152
- const suggestedVersion = getSuggestedVersion();
153
-
154
- let message = 'Type the new version, "skip" or "internal"';
155
-
156
- if ( options.disableInternalVersion ) {
157
- message = 'Type the new version or "skip"';
158
- }
159
-
160
- message += ` (suggested: "${ suggestedVersion }", current: "${ packageVersion }"):`;
161
-
162
- const versionQuestion = {
163
- type: 'input',
164
- name: 'version',
165
- default: suggestedVersion,
166
- message,
167
-
168
- filter( input ) {
169
- return input.trim();
170
- },
171
-
172
- validate( input ) {
173
- if ( !options.disableSkipVersion && input === 'skip' ) {
174
- return true;
175
- }
176
-
177
- if ( !options.disableInternalVersion && input === 'internal' ) {
178
- return true;
179
- }
180
-
181
- // TODO: Check whether provided version is available.
182
- return semver.valid( input ) ? true : 'Please provide a valid version.';
183
- },
184
-
185
- prefix: getPrefix( indentLevel )
186
- };
187
-
188
- return inquirer.prompt( [ versionQuestion ] )
189
- .then( answers => answers.version );
190
-
191
- function getSuggestedVersion() {
192
- if ( !releaseTypeOrNewVersion || releaseTypeOrNewVersion === 'skip' ) {
193
- return 'skip';
194
- }
195
-
196
- if ( semver.valid( releaseTypeOrNewVersion ) ) {
197
- return releaseTypeOrNewVersion;
198
- }
199
-
200
- if ( releaseTypeOrNewVersion === 'internal' ) {
201
- return options.disableInternalVersion ? 'skip' : 'internal';
202
- }
203
-
204
- if ( semver.prerelease( packageVersion ) ) {
205
- releaseTypeOrNewVersion = 'prerelease';
206
- }
207
-
208
- // If package's version is below the '1.0.0', bump the 'minor' instead of 'major'
209
- if ( releaseTypeOrNewVersion === 'major' && semver.gt( '1.0.0', packageVersion ) ) {
210
- return semver.inc( packageVersion, 'minor' );
211
- }
212
-
213
- return semver.inc( packageVersion, releaseTypeOrNewVersion );
214
- }
215
- },
216
-
217
- /**
218
- * Asks a user for providing the new version for a major release.
219
- *
220
- * @param {String} version
221
- * @param {String} foundPackage
222
- * @param {String} bumpType
223
- * @param {Object} [options={}]
224
- * @param {Number} [options.indentLevel=0] The indent level.
225
- * @returns {Promise.<String>}
226
- */
227
- provideNewVersionForMonoRepository( version, foundPackage, bumpType, options = {} ) {
228
- const indentLevel = options.indentLevel || 0;
229
- const suggestedVersion = semver.inc( version, bumpType );
230
-
231
- const message = 'Type the new version ' +
232
- `(current highest: "${ version }" found in "${ chalk.underline( foundPackage ) }", suggested: "${ suggestedVersion }"):`;
233
-
234
- const versionQuestion = {
235
- type: 'input',
236
- name: 'version',
237
- default: suggestedVersion,
238
- message,
239
-
240
- filter( input ) {
241
- return input.trim();
242
- },
243
-
244
- validate( input ) {
245
- if ( !semver.valid( input ) ) {
246
- return 'Please provide a valid version.';
247
- }
248
-
249
- return semver.gt( input, version ) ? true : `Provided version must be higher than "${ version }".`;
250
- },
251
- prefix: getPrefix( indentLevel )
252
- };
253
-
254
- return inquirer.prompt( [ versionQuestion ] )
255
- .then( answers => answers.version );
256
- },
257
-
258
- /**
259
- * Asks a user for providing the GitHub token.
260
- *
261
- * @returns {Promise.<String>}
262
- */
263
- provideToken() {
264
- const tokenQuestion = {
265
- type: 'password',
266
- name: 'token',
267
- message: 'Provide the GitHub token:',
268
- validate( input ) {
269
- return input.length === 40 ? true : 'Please provide a valid token.';
270
- }
271
- };
272
-
273
- return inquirer.prompt( [ tokenQuestion ] )
274
- .then( answers => answers.token );
275
- },
276
-
277
- /**
278
- * Asks a user for selecting services where packages will be released.
279
- *
280
- * If the user choices a GitHub, required token also has to be provided.
281
- *
282
- * @returns {Promise.<Object>}
283
- */
284
- configureReleaseOptions() {
285
- const options = {};
286
-
287
- const servicesQuestion = {
288
- type: 'checkbox',
289
- name: 'services',
290
- message: 'Select services where packages will be released:',
291
- choices: [
292
- 'npm',
293
- 'GitHub'
294
- ],
295
- default: [
296
- 'npm',
297
- 'GitHub'
298
- ]
299
- };
300
-
301
- return inquirer.prompt( [ servicesQuestion ] )
302
- .then( answers => {
303
- options.npm = answers.services.includes( 'npm' );
304
- options.github = answers.services.includes( 'GitHub' );
305
-
306
- if ( !options.github ) {
307
- return options;
308
- }
309
-
310
- return cli.provideToken()
311
- .then( token => {
312
- options.token = token;
313
-
314
- return options;
315
- } );
316
- } );
317
- },
318
-
319
- /**
320
- * Asks a user for a confirmation for updating and tagging versions of the packages.
321
- *
322
- * @param {String} versionTag A version tag based on a package version specified in `package.json`.
323
- * @param {String} npmTag A tag typed by the user when using the release tools.
324
- * @returns {Promise.<Boolean>}
325
- */
326
- confirmNpmTag( versionTag, npmTag ) {
327
- const areVersionsEqual = versionTag === npmTag;
328
- const color = areVersionsEqual ? chalk.magenta : chalk.red;
329
-
330
- // eslint-disable-next-line max-len
331
- const message = `The next release bumps the "${ color( versionTag ) }" version. Should it be published to npm as "${ color( npmTag ) }"?`;
332
-
333
- const confirmQuestion = {
334
- message,
335
- type: 'confirm',
336
- name: 'confirm',
337
- default: areVersionsEqual
338
- };
339
-
340
- return inquirer.prompt( [ confirmQuestion ] )
341
- .then( answers => answers.confirm );
342
- }
343
- };
344
-
345
- module.exports = cli;
346
-
347
- function getPrefix( indent ) {
348
- return ' '.repeat( indent * cli.INDENT_SIZE ) + QUESTION_MARK;
349
- }