cask.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const fs = require('fs');
  2. const path = require('path');
  3. const http = require('http');
  4. const https = require('https');
  5. const crypto = require('crypto');
  6. const configuration = require('../package.json');
  7. const caskFile = process.argv[2];
  8. const get = (url, timeout) => {
  9. return new Promise((resolve, reject) => {
  10. const httpModule = url.split(':').shift() === 'https' ? https : http;
  11. const request = httpModule.request(url, {}, (response) => {
  12. if (response.statusCode === 200) {
  13. const data = [];
  14. let position = 0;
  15. response.on('data', (chunk) => {
  16. data.push(chunk);
  17. position += chunk.length;
  18. process.stdout.write(' ' + position + ' bytes\r');
  19. });
  20. response.on('err', (err) => {
  21. reject(err);
  22. });
  23. response.on('end', () => {
  24. resolve(Buffer.concat(data));
  25. });
  26. }
  27. else if (response.statusCode === 302) {
  28. get(response.headers.location).then((data) => {
  29. resolve(data);
  30. }).catch((err) => {
  31. reject(err);
  32. });
  33. }
  34. else {
  35. const err = new Error("The web request failed with status code " + response.statusCode + " at '" + url + "'.");
  36. err.type = 'error';
  37. err.url = url;
  38. err.status = response.statusCode;
  39. reject(err);
  40. }
  41. });
  42. request.on("error", (err) => {
  43. reject(err);
  44. });
  45. if (timeout) {
  46. request.setTimeout(timeout, () => {
  47. request.destroy();
  48. const err = new Error("The web request timed out at '" + url + "'.");
  49. err.type = 'timeout';
  50. err.url = url;
  51. reject(err);
  52. });
  53. }
  54. request.end();
  55. });
  56. };
  57. const name = configuration.name;
  58. const version = configuration.version;
  59. const productName = configuration.productName;
  60. const description = configuration.description;
  61. const repository = 'https://github.com/' + configuration.repository;
  62. const url = repository + '/releases/download/v#{version}/' + productName + '-#{version}-mac.zip';
  63. const location = url.replace(/#{version}/g, version);
  64. get(location).then((data) => {
  65. const sha256 = crypto.createHash('sha256').update(data).digest('hex').toLowerCase();
  66. const caskDir = path.dirname(caskFile);
  67. if (!fs.existsSync(caskDir)){
  68. fs.mkdirSync(caskDir, { recursive: true });
  69. }
  70. fs.writeFileSync(caskFile, [
  71. 'cask "' + name + '" do',
  72. ' version "' + version + '"',
  73. ' sha256 "' + sha256 + '"',
  74. '',
  75. ' url "' + url + '"',
  76. ' name "' + productName + '"',
  77. ' desc "' + description + '"',
  78. ' homepage "' + repository + '"',
  79. '',
  80. ' auto_updates true',
  81. '',
  82. ' app "' + productName + '.app"',
  83. 'end',
  84. ''
  85. ].join('\n'));
  86. }).catch((err) => {
  87. /* eslint-disable */
  88. console.log(err.message);
  89. /* eslint-enable */
  90. });