8
0

release-ckeditor5.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #!/usr/bin/env node
  2. /**
  3. * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
  4. * For licensing, see LICENSE.md.
  5. */
  6. /* eslint-env node */
  7. 'use strict';
  8. const path = require( 'path' );
  9. const { tools, logger } = require( '@ckeditor/ckeditor5-dev-utils' );
  10. const versionUtils = require( '@ckeditor/ckeditor5-dev-env/lib/release-tools/utils/versions' );
  11. const cli = require( '@ckeditor/ckeditor5-dev-env/lib/release-tools/utils/cli' );
  12. const createGithubRelease = require( '@ckeditor/ckeditor5-dev-env/lib/release-tools/utils/creategithubrelease' );
  13. const validatePackageToRelease = require( '@ckeditor/ckeditor5-dev-env/lib/release-tools/utils/validatepackagetorelease' );
  14. const { getChangesForVersion } = require( '@ckeditor/ckeditor5-dev-env/lib/release-tools/utils/changelog' );
  15. const log = logger();
  16. const packageJsonPath = path.resolve( __dirname, '..', '..', 'package.json' );
  17. const packageJsonTemplatePath = path.resolve( __dirname, 'template', 'package.json' );
  18. // The first one is the template, the later is the original package file.
  19. const packageJsonTemplateCopy = require( packageJsonTemplatePath );
  20. let packageJsonCopy;
  21. cli.provideToken()
  22. .then( token => {
  23. const gitVersion = versionUtils.getLastTagFromGit();
  24. const changelogVersion = versionUtils.getLastFromChangelog();
  25. log.info( 'Comparing versions - saved in changelog and as a tag...' );
  26. // If the last tag is equal to version saved in changelog, we don't have new version for release.
  27. if ( gitVersion === changelogVersion ) {
  28. return reject( 'Before starting the release process, you should generate the changelog.' );
  29. }
  30. const releaseDescription = getChangesForVersion( changelogVersion );
  31. log.info( 'Validating the repository for the release...' );
  32. const errors = validatePackageToRelease( {
  33. version: changelogVersion,
  34. changes: releaseDescription
  35. } );
  36. // Abort due to errors during validation.
  37. if ( errors.length ) {
  38. const log = logger();
  39. log.error( 'Unexpected errors occured:' );
  40. errors.map( err => '* ' + err ).forEach( log.error.bind( log ) );
  41. return reject( 'Releasing has been aborted due to errors.' );
  42. }
  43. log.info( 'Bumping the version...' );
  44. // Bump the version.
  45. tools.shExec( `npm version ${ changelogVersion } --message "Release: v${ changelogVersion }."`, { verbosity: 'error' } );
  46. log.info( 'Updating the package.json...' );
  47. // Update the `package.json`. Published package shouldn't have any dependencies and devDependencies.
  48. // Also, we should omit our environment scripts and their configs.
  49. tools.updateJSONFile( packageJsonPath, packageJson => {
  50. // Save the original file. It will be restored after publishing the package.
  51. packageJsonCopy = Object.assign( {}, packageJson );
  52. const newPackageJson = Object.assign( {}, packageJsonTemplateCopy );
  53. for ( const property of Object.keys( newPackageJson ) ) {
  54. // If the `property` is set in the template, leave it.
  55. if ( newPackageJson[ property ] ) {
  56. continue;
  57. }
  58. // In other case – copy value from original package.json file.
  59. newPackageJson[ property ] = packageJson[ property ];
  60. }
  61. // The files listed below will be published even if they won't be specified under the `files` key in package.json.
  62. // However, instead of creating the `.npmignore` file and specifying everything here, we can list files that we want to publish.
  63. // It means that everything except that files will be ignored (what is our goal).
  64. newPackageJson.files = [
  65. 'CHANGELOG.md',
  66. 'LICENSE.md',
  67. 'README.md',
  68. 'package.json'
  69. ];
  70. return newPackageJson;
  71. } );
  72. log.info( 'Publishing on npm...' );
  73. // Publish the package on npm.
  74. tools.shExec( 'npm publish' );
  75. log.info( 'Creating a release on GitHub...' );
  76. // Create a release on GitHub.
  77. return createGithubRelease( token, {
  78. repositoryOwner: 'ckeditor',
  79. repositoryName: 'ckeditor5',
  80. version: changelogVersion,
  81. description: releaseDescription
  82. } );
  83. } )
  84. .then( () => {
  85. log.info( 'Restoring the package.json...' );
  86. // Restore the `package.json` to state before the publishing process.
  87. tools.updateJSONFile( packageJsonPath, () => packageJsonCopy );
  88. // And the template `package.json`.
  89. tools.updateJSONFile( packageJsonTemplatePath, () => packageJsonTemplateCopy );
  90. const url = `https://github.com/ckeditor/ckeditor5/releases/tag/v${ packageJsonCopy.version }`;
  91. log.info( `Created the release: ${ url }` );
  92. } )
  93. .catch( err => {
  94. log.error( err.stack );
  95. } );
  96. function reject( message ) {
  97. return Promise.reject( new Error( message ) );
  98. }