publish-to-npm.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. const temp = require('temp')
  2. const fs = require('fs')
  3. const path = require('path')
  4. const childProcess = require('child_process')
  5. const GitHubApi = require('github')
  6. const request = require('request')
  7. const assert = require('assert')
  8. const rootPackageJson = require('../package.json')
  9. const github = new GitHubApi({
  10. // debug: true,
  11. headers: { 'User-Agent': 'electron-npm-publisher' },
  12. followRedirects: false
  13. })
  14. let tempDir
  15. temp.track() // track and cleanup files at exit
  16. const files = [
  17. 'cli.js',
  18. 'index.js',
  19. 'install.js',
  20. 'package.json',
  21. 'README.md',
  22. 'LICENSE'
  23. ]
  24. const jsonFields = [
  25. 'name',
  26. 'version',
  27. 'repository',
  28. 'description',
  29. 'license',
  30. 'author',
  31. 'keywords'
  32. ]
  33. let npmTag = ''
  34. new Promise((resolve, reject) => {
  35. temp.mkdir('electron-npm', (err, dirPath) => {
  36. if (err) {
  37. reject(err)
  38. } else {
  39. resolve(dirPath)
  40. }
  41. })
  42. })
  43. .then((dirPath) => {
  44. tempDir = dirPath
  45. // copy files from `/npm` to temp directory
  46. files.forEach((name) => {
  47. const noThirdSegment = name === 'README.md' || name === 'LICENSE'
  48. fs.writeFileSync(
  49. path.join(tempDir, name),
  50. fs.readFileSync(path.join(__dirname, '..', noThirdSegment ? '' : 'npm', name))
  51. )
  52. })
  53. // copy from root package.json to temp/package.json
  54. const packageJson = require(path.join(tempDir, 'package.json'))
  55. jsonFields.forEach((fieldName) => {
  56. packageJson[fieldName] = rootPackageJson[fieldName]
  57. })
  58. fs.writeFileSync(
  59. path.join(tempDir, 'package.json'),
  60. JSON.stringify(packageJson, null, 2)
  61. )
  62. return github.repos.getReleases({
  63. owner: 'electron',
  64. repo: 'electron'
  65. })
  66. })
  67. .then((releases) => {
  68. // download electron.d.ts from release
  69. const release = releases.data.find(
  70. (release) => release.tag_name === `v${rootPackageJson.version}`
  71. )
  72. if (!release) {
  73. throw new Error(`cannot find release with tag v${rootPackageJson.version}`)
  74. }
  75. return release
  76. })
  77. .then((release) => {
  78. const tsdAsset = release.assets.find((asset) => asset.name === 'electron.d.ts')
  79. if (!tsdAsset) {
  80. throw new Error(`cannot find electron.d.ts from v${rootPackageJson.version} release assets`)
  81. }
  82. return new Promise((resolve, reject) => {
  83. request.get({
  84. url: tsdAsset.url,
  85. headers: {
  86. 'accept': 'application/octet-stream',
  87. 'user-agent': 'electron-npm-publisher'
  88. }
  89. }, (err, response, body) => {
  90. if (err || response.statusCode !== 200) {
  91. reject(err || new Error('Cannot download electron.d.ts'))
  92. } else {
  93. fs.writeFileSync(path.join(tempDir, 'electron.d.ts'), body)
  94. resolve(release)
  95. }
  96. })
  97. })
  98. })
  99. .then((release) => {
  100. npmTag = release.prerelease ? 'beta' : 'latest'
  101. })
  102. .then(() => childProcess.execSync('npm pack', { cwd: tempDir }))
  103. .then(() => {
  104. // test that the package can install electron prebuilt from github release
  105. const tarballPath = path.join(tempDir, `${rootPackageJson.name}-${rootPackageJson.version}.tgz`)
  106. return new Promise((resolve, reject) => {
  107. childProcess.execSync(`npm install ${tarballPath} --force --silent`, {
  108. env: Object.assign({}, process.env, { electron_config_cache: tempDir }),
  109. cwd: tempDir
  110. })
  111. const checkVersion = childProcess.execSync(`${path.join(tempDir, 'node_modules', '.bin', 'electron')} -v`)
  112. assert.ok((`v${rootPackageJson.version}`.indexOf(checkVersion.toString().trim()) === 0), `Version is correct`)
  113. resolve(tarballPath)
  114. })
  115. })
  116. .then((tarballPath) => childProcess.execSync(`npm publish ${tarballPath} --tag ${npmTag}`))
  117. .catch((err) => {
  118. console.error(`Error: ${err}`)
  119. process.exit(1)
  120. })