packaging.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. /* jshint node:true */
  2. module.exports = function(grunt) {
  3. 'use strict';
  4. var path = require('path');
  5. var basedir = path.dirname(grunt.file.findup('Gruntfile.js'));
  6. var theme_name = grunt.file.readJSON(path.join(basedir, 'package.json')).name;
  7. var builddir = path.join(basedir, 'build', theme_name);
  8. var secrets_path = grunt.file.findup('secrets.json');
  9. var secrets = secrets_path ? require( secrets_path ) : {
  10. livepath: '',
  11. ssh_host: '',
  12. export_api_url: '',
  13. export_api_key: ''
  14. };
  15. function exportApiCall(action, callback) {
  16. var http = require('https');
  17. var url = secrets.export_api_url + secrets.export_api_key + '/' + action;
  18. grunt.log.writeln( url );
  19. http.get(url, function(res) {
  20. var body = '';
  21. res.on('data', function(chunk) {
  22. body += chunk;
  23. });
  24. res.on('end', function() {
  25. var response = body;
  26. try {
  27. response = JSON.parse(body.trim());
  28. } catch(e) {}
  29. if ( 'error' in response ) {
  30. return callback( response.error );
  31. }
  32. callback(null, response);
  33. });
  34. }).on('error', function(err) {
  35. callback(err);
  36. });
  37. }
  38. grunt.registerTask('scp-download-samples', function() {
  39. var done = this.async();
  40. var files = [
  41. ['cache/all.css', 'samples/all-default.css'],
  42. ], fi = -1;
  43. var next = function() {
  44. if(++fi >= files.length)
  45. return done();
  46. grunt.log.writeln('Downloading '+files[fi][0]+' to '+files[fi][1]);
  47. var exec = require('child_process').exec;
  48. var scp = grunt.template.process("scp <%= ssh_host %>:<%= remotepath %> <%= localpath %>", {
  49. data: {
  50. ssh_host: secrets.ssh_host,
  51. remotepath: path.join( grunt.template.process(secrets.livepath, grunt.config()), files[fi][0] ),
  52. localpath: path.join(builddir, files[fi][1]),
  53. }
  54. });
  55. exec(scp, function(error) {
  56. if(error) return done(grunt.util.error(error));
  57. next();
  58. });
  59. };
  60. next();
  61. });
  62. grunt.registerTask('download-layerslider', function() {
  63. var done = this.async();
  64. var exec = require('child_process').exec;
  65. var fs = require("fs");
  66. var localdir = path.join(builddir, 'samples/layerslider/');
  67. grunt.file.mkdir(localdir);
  68. grunt.log.writeln('Downloading layerslider-export.zip');
  69. var temp_file = '/tmp/layerslider-export.zip';
  70. exportApiCall( 'layerslider', function(err, res) {
  71. if(err) return done(false);
  72. var curl = "curl -o " + temp_file + " " + res.exported;
  73. exec(curl, function(error) {
  74. if(error) return done(grunt.util.error(error));
  75. var data = grunt.file.read( temp_file, { encoding: 'binary' } );
  76. var Zip = require('node-zip');
  77. var spread = new Zip( data, { base64: false, checkCRC32: true});
  78. Object.keys(spread.files).forEach( function( f ) {
  79. if ( ! f.match( /json$/ ) ) {
  80. return true;
  81. }
  82. var single = new Zip();
  83. single.file( f, spread.file(f).asText() );
  84. var data = single.generate( { base64: false } );
  85. var spath = path.join( localdir, f.split( '/' )[0] );
  86. grunt.file.mkdir( spath );
  87. fs.writeFileSync( path.join( spath, 'slider.zip' ), data, 'binary' );
  88. grunt.file.copy( path.join( basedir, 'samples', 'small.png' ), path.join( spath, 'preview.png' ) );
  89. } );
  90. done();
  91. });
  92. });
  93. });
  94. grunt.registerTask('download-revslider', function() {
  95. var done = this.async();
  96. exportApiCall('revslider', function(err, res) {
  97. if(err) return done(grunt.util.error("API error:"+err));
  98. if ( res.length === 0 ) {
  99. done( grunt.util.error( 'No sliders found, possibly something went wrong.' ) );
  100. console.error( res );
  101. return;
  102. }
  103. var exec = require('child_process').exec;
  104. var localdir = path.join(builddir, 'samples/revslider/');
  105. grunt.file.mkdir(localdir);
  106. var ri = -1;
  107. var next = function() {
  108. if(++ri >= res.length)
  109. return done();
  110. grunt.log.writeln('Downloading '+res[ri]);
  111. var url = secrets.export_api_url + secrets.export_api_key + '/revslider-single/' + res[ri];
  112. var curl = "curl -o '" + path.join(localdir, res[ri] + '.zip') + "' '" + url + "'";
  113. exec(curl, function(error) {
  114. if(error) return done(grunt.util.error(error));
  115. next();
  116. });
  117. };
  118. next();
  119. });
  120. });
  121. grunt.registerTask('download-ninjaforms', function() {
  122. var done = this.async();
  123. exportApiCall('ninja-forms-list', function(err, res) {
  124. if ( err ) {
  125. done( grunt.util.error("API error: "+err ) );
  126. return;
  127. }
  128. if ( res.length === 0 ) {
  129. done( grunt.util.error( 'No forms found, possibly something went wrong.' ) );
  130. console.error( res );
  131. return;
  132. }
  133. var exec = require('child_process').exec;
  134. var localdir = path.join(builddir, 'samples/ninja-forms/');
  135. grunt.file.mkdir(localdir);
  136. var ri = -1;
  137. var next = function() {
  138. if(++ri >= res.length)
  139. return done();
  140. grunt.log.writeln('Downloading '+res[ri]);
  141. var url = secrets.export_api_url + secrets.export_api_key + '/ninja-forms-download/' + res[ri];
  142. var curl = "curl -o " + path.join(localdir, res[ri] + '.nff') + " " + url;
  143. exec(curl, function(error) {
  144. if(error) return done(grunt.util.error(error));
  145. next();
  146. });
  147. };
  148. next();
  149. });
  150. });
  151. grunt.registerTask('download-booked', function() {
  152. var done = this.async();
  153. exportApiCall('booked-settings', function(err, res) {
  154. if ( err ) {
  155. done( grunt.util.error("API error: " + err ) );
  156. return;
  157. }
  158. var exec = require('child_process').exec;
  159. var localpath = path.join(builddir, 'samples/booked-settings.json');
  160. grunt.file.write( localpath, JSON.stringify( res ) );
  161. done();
  162. });
  163. });
  164. grunt.registerTask('download-gmp-easy', function() {
  165. var done = this.async();
  166. var exec = require('child_process').exec;
  167. var localdir = path.join(builddir, 'samples/');
  168. var url = secrets.export_api_url + secrets.export_api_key + '/google-maps-easy-download';
  169. var curl = "curl -o " + path.join(localdir, 'gmp-easy.csv') + " " + url;
  170. grunt.log.writeln( url );
  171. exec(curl, function(error) {
  172. if ( error ) {
  173. return done( grunt.util.error( error ) );
  174. }
  175. done();
  176. });
  177. });
  178. grunt.registerTask('download-json', function( name ) {
  179. var done = this.async();
  180. exportApiCall( name, function(err, res) {
  181. if ( err ) {
  182. done( grunt.util.error("API error: " + err ) );
  183. return;
  184. }
  185. var exec = require('child_process').exec;
  186. var localpath = path.join(builddir, 'samples/', name + '.json');
  187. grunt.file.write( localpath, JSON.stringify( res ) )
  188. done();
  189. });
  190. });
  191. grunt.registerTask('check-api', function() {
  192. var done = this.async();
  193. exportApiCall('api-version', function(err, res) {
  194. if(err) return done(false);
  195. if(!('version' in res) || res.version < grunt.config('pkg').vamtamApi)
  196. return done(grunt.util.error("Old Export API. Please update the plugin to version " + grunt.config('pkg').vamtamApi));
  197. done();
  198. });
  199. });
  200. grunt.registerTask('download-sidebars-options', function() {
  201. var done = this.async();
  202. var parts = [
  203. ['sidebars', 'sidebars', 'sidebars'],
  204. ['default-options-beaver', 'default-options.php', 'options'],
  205. ], pi = -1;
  206. var next = function() {
  207. if(++pi >= parts.length)
  208. return done();
  209. grunt.log.writeln('Downloading '+parts[pi][1]);
  210. exportApiCall(parts[pi][0], function(err, res) {
  211. if(err) return done(false);
  212. grunt.file.write(path.join(builddir, "samples", parts[pi][1]), res[parts[pi][2]].replace(/(\r\n|\r|\n)/g, "\n"));
  213. next();
  214. });
  215. };
  216. next();
  217. });
  218. grunt.registerTask('download-content-xml', function() {
  219. var done = this.async();
  220. exportApiCall('content.xml-beaver', function(err, res) {
  221. if(err) return done(grunt.util.error("API error:"+err));
  222. console.log(res);
  223. var exec = require('child_process').exec;
  224. var curl = "curl -o "+path.join(builddir, 'samples', 'content.xml')+" "+res.download_url;
  225. exec(curl, function(err) {
  226. if(err) return done(grunt.util.error(err));
  227. grunt.log.writeln("saved content.xml");
  228. done();
  229. });
  230. });
  231. });
  232. grunt.registerTask('download-images', function() {
  233. var done = this.async();
  234. var localdir = path.join(builddir, 'samples/images/');
  235. grunt.file.mkdir(localdir);
  236. exportApiCall('image-replacements', function(err, res) {
  237. if(!('images' in res))
  238. return done(grunt.util.error('No image info.'));
  239. var images = res.images.filter(function(s) { return s; }),
  240. i = 0;
  241. var next = function() {
  242. if(i >= images.length) return done();
  243. var image_url = images[i++];
  244. var localpath = path.join(localdir, path.basename(image_url));
  245. var exec = require('child_process').exec;
  246. var curl = "curl -o "+localpath+" "+image_url;
  247. exec(curl, function(err) {
  248. if(err) return done(grunt.util.error(err));
  249. grunt.log.writeln("saved: "+image_url);
  250. next();
  251. });
  252. };
  253. next();
  254. });
  255. });
  256. grunt.registerMultiTask('add-textdomain', function() {
  257. var files = grunt.file.expand(this.data);
  258. for(var fi in files) {
  259. grunt.file.write(files[fi],
  260. grunt.file.read(files[fi])
  261. .replace( /,\s*(['"])(vamtam|wpv)\1/g, ", '"+theme_name+"'")
  262. .replace( /(load_theme_textdomain|is_textdomain_loaded)\(\s*'(vamtam|wpv)'/g, "$1( '"+theme_name+"'")
  263. );
  264. }
  265. });
  266. grunt.registerTask('build-plugins', function() {
  267. var done = this.async();
  268. var prefix = 'vamtam/plugins/';
  269. var plugins = grunt.file.expand([
  270. prefix + '*',
  271. '!'+ prefix + '*.*',
  272. ]);
  273. plugins.forEach(function(dirname) {
  274. var plugin_name = dirname.replace(prefix, '');
  275. grunt.config.set('compress.plugin-'+plugin_name, {
  276. options: {
  277. archive: prefix + plugin_name + '.zip',
  278. mode: 'zip',
  279. pretty: true,
  280. level: 9,
  281. },
  282. files: [{
  283. expand: true,
  284. src: [
  285. plugin_name + '/**/*',
  286. '!' + plugin_name + '/node_modules/**',
  287. ],
  288. cwd: 'vamtam/plugins/'
  289. }]
  290. });
  291. grunt.task.run('compress:plugin-'+plugin_name);
  292. });
  293. done();
  294. });
  295. };