create.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. /*******************************
  2. Create Component Repos
  3. *******************************/
  4. /*
  5. This will create individual component repositories for each SUI component
  6. * copy component files from release
  7. * create commonjs files as index.js for NPM release
  8. * create release notes that filter only items related to component
  9. * custom package.json file from template
  10. * create bower.json from template
  11. * create README from template
  12. * create meteor.js file
  13. */
  14. var
  15. gulp = require('gulp'),
  16. // node dependencies
  17. fs = require('fs'),
  18. path = require('path'),
  19. // admin dependencies
  20. concatFileNames = require('gulp-concat-filenames'),
  21. flatten = require('gulp-flatten'),
  22. jsonEditor = require('gulp-json-editor'),
  23. plumber = require('gulp-plumber'),
  24. rename = require('gulp-rename'),
  25. replace = require('gulp-replace'),
  26. tap = require('gulp-tap'),
  27. // config
  28. config = require('../../config/user'),
  29. release = require('../../config/admin/release'),
  30. project = require('../../config/project/release'),
  31. // shorthand
  32. version = project.version,
  33. output = config.paths.output
  34. ;
  35. module.exports = function(callback) {
  36. var
  37. stream,
  38. index,
  39. tasks = []
  40. ;
  41. for(index in release.components) {
  42. var
  43. component = release.components[index]
  44. ;
  45. // streams... designed to save time and make coding fun...
  46. (function(component) {
  47. var
  48. outputDirectory = path.join(release.outputRoot, component),
  49. isJavascript = fs.existsSync(output.compressed + component + '.js'),
  50. isCSS = fs.existsSync(output.compressed + component + '.css'),
  51. capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
  52. packageName = release.packageRoot + component,
  53. repoName = release.componentRepoRoot + capitalizedComponent,
  54. gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git',
  55. repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
  56. concatSettings = {
  57. newline : '',
  58. root : outputDirectory,
  59. prepend : " '",
  60. append : "',"
  61. },
  62. regExp = {
  63. match : {
  64. // templated values
  65. name : '{component}',
  66. titleName : '{Component}',
  67. version : '{version}',
  68. files : '{files}',
  69. // release notes
  70. spacedVersions : /(###.*\n)\n+(?=###)/gm,
  71. spacedLists : /(^- .*\n)\n+(?=^-)/gm,
  72. trim : /^\s+|\s+$/g,
  73. unrelatedNotes : new RegExp('^((?!(^.*(' + component + ').*$|###.*)).)*$', 'gmi'),
  74. whitespace : /\n\s*\n\s*\n/gm,
  75. // npm
  76. componentExport : /(.*)\$\.fn\.\w+\s*=\s*function\(([^\)]*)\)\s*{/g,
  77. componentReference: '$.fn.' + component,
  78. settingsExport : /\$\.fn\.\w+\.settings\s*=/g,
  79. settingsReference : /\$\.fn\.\w+\.settings/g,
  80. trailingComma : /,(?=[^,]*$)/,
  81. jQuery : /jQuery/g,
  82. },
  83. replace : {
  84. // readme
  85. name : component,
  86. titleName : capitalizedComponent,
  87. // release notes
  88. spacedVersions : '',
  89. spacedLists : '$1',
  90. trim : '',
  91. unrelatedNotes : '',
  92. whitespace : '\n\n',
  93. // npm
  94. componentExport : 'var _module = module;\n$1module.exports = function($2) {',
  95. componentReference: '_module.exports',
  96. settingsExport : 'module.exports.settings =',
  97. settingsReference : '_module.exports.settings',
  98. jQuery : 'require("jquery")'
  99. }
  100. },
  101. task = {
  102. all : component + ' creating',
  103. repo : component + ' create repo',
  104. bower : component + ' create bower.json',
  105. readme : component + ' create README',
  106. npm : component + ' create NPM Module',
  107. notes : component + ' create release notes',
  108. composer : component + ' create composer.json',
  109. package : component + ' create package.json',
  110. meteor : component + ' create meteor package.js',
  111. },
  112. // paths to includable assets
  113. manifest = {
  114. assets : outputDirectory + '/assets/**/' + component + '?(s).*',
  115. component : outputDirectory + '/' + component + '+(.js|.css)'
  116. }
  117. ;
  118. // copy dist files into output folder adjusting asset paths
  119. function copyDist() {
  120. return gulp.src(release.source + component + '.*')
  121. .pipe(plumber())
  122. .pipe(flatten())
  123. .pipe(replace(release.paths.source, release.paths.output))
  124. .pipe(gulp.dest(outputDirectory))
  125. ;
  126. }
  127. // create npm module
  128. function createNpmModule() {
  129. return gulp.src(release.source + component + '!(*.min|*.map).js')
  130. .pipe(plumber())
  131. .pipe(flatten())
  132. .pipe(replace(regExp.match.componentExport, regExp.replace.componentExport))
  133. .pipe(replace(regExp.match.componentReference, regExp.replace.componentReference))
  134. .pipe(replace(regExp.match.settingsExport, regExp.replace.settingsExport))
  135. .pipe(replace(regExp.match.settingsReference, regExp.replace.settingsReference))
  136. .pipe(replace(regExp.match.jQuery, regExp.replace.jQuery))
  137. .pipe(rename('index.js'))
  138. .pipe(gulp.dest(outputDirectory))
  139. ;
  140. }
  141. // create readme
  142. function createReadme() {
  143. return gulp.src(release.templates.readme)
  144. .pipe(plumber())
  145. .pipe(flatten())
  146. .pipe(replace(regExp.match.name, regExp.replace.name))
  147. .pipe(replace(regExp.match.titleName, regExp.replace.titleName))
  148. .pipe(gulp.dest(outputDirectory))
  149. ;
  150. }
  151. // extend bower.json
  152. function extendBower() {
  153. return gulp.src(release.templates.bower)
  154. .pipe(plumber())
  155. .pipe(flatten())
  156. .pipe(jsonEditor(function(bower) {
  157. bower.name = packageName;
  158. bower.description = capitalizedComponent + ' - Semantic UI';
  159. if(isJavascript) {
  160. if(isCSS) {
  161. bower.main = [
  162. component + '.js',
  163. component + '.css'
  164. ];
  165. }
  166. else {
  167. bower.main = [
  168. component + '.js'
  169. ];
  170. }
  171. bower.dependencies = {
  172. jquery: '>=1.8'
  173. };
  174. }
  175. else {
  176. bower.main = [
  177. component + '.css'
  178. ];
  179. }
  180. return bower;
  181. }))
  182. .pipe(gulp.dest(outputDirectory))
  183. ;
  184. }
  185. // extend package.json
  186. function extendPackage() {
  187. return gulp.src(release.templates.package)
  188. .pipe(plumber())
  189. .pipe(flatten())
  190. .pipe(jsonEditor(function(npm) {
  191. if(isJavascript) {
  192. npm.dependencies = {
  193. jquery: 'x.x.x'
  194. };
  195. npm.main = 'index.js';
  196. }
  197. npm.name = packageName;
  198. if(version) {
  199. npm.version = version;
  200. }
  201. npm.title = 'Semantic UI - ' + capitalizedComponent;
  202. npm.description = 'Single component release of ' + component;
  203. npm.repository = {
  204. type : 'git',
  205. url : gitURL
  206. };
  207. return npm;
  208. }))
  209. .pipe(gulp.dest(outputDirectory))
  210. ;
  211. }
  212. // extend composer.json
  213. function extendComposer(){
  214. return gulp.src(release.templates.composer)
  215. .pipe(plumber())
  216. .pipe(flatten())
  217. .pipe(jsonEditor(function(composer) {
  218. if(isJavascript) {
  219. composer.dependencies = {
  220. jquery: 'x.x.x'
  221. };
  222. composer.main = component + '.js';
  223. }
  224. composer.name = 'semantic/' + component;
  225. if(version) {
  226. composer.version = version;
  227. }
  228. composer.description = 'Single component release of ' + component;
  229. return composer;
  230. }))
  231. .pipe(gulp.dest(outputDirectory))
  232. ;
  233. }
  234. // create release notes
  235. function createReleaseNotes() {
  236. return gulp.src(release.templates.notes)
  237. .pipe(plumber())
  238. .pipe(flatten())
  239. // Remove release notes for lines not mentioning component
  240. .pipe(replace(regExp.match.unrelatedNotes, regExp.replace.unrelatedNotes))
  241. .pipe(replace(regExp.match.whitespace, regExp.replace.whitespace))
  242. .pipe(replace(regExp.match.spacedVersions, regExp.replace.spacedVersions))
  243. .pipe(replace(regExp.match.spacedLists, regExp.replace.spacedLists))
  244. .pipe(replace(regExp.match.trim, regExp.replace.trim))
  245. .pipe(gulp.dest(outputDirectory))
  246. ;
  247. }
  248. // Creates meteor package.js
  249. function createMeteorPackage() {
  250. var
  251. filenames = ''
  252. ;
  253. return gulp.src(manifest.component)
  254. .pipe(concatFileNames('empty.txt', concatSettings))
  255. .pipe(tap(function(file) {
  256. filenames += file.contents;
  257. }))
  258. .on('end', function() {
  259. gulp.src(manifest.assets)
  260. .pipe(concatFileNames('empty.txt', concatSettings))
  261. .pipe(tap(function(file) {
  262. filenames += file.contents;
  263. }))
  264. .on('end', function() {
  265. // remove trailing slash
  266. filenames = filenames.replace(regExp.match.trailingComma, '').trim();
  267. gulp.src(release.templates.meteor.component)
  268. .pipe(plumber())
  269. .pipe(flatten())
  270. .pipe(replace(regExp.match.name, regExp.replace.name))
  271. .pipe(replace(regExp.match.titleName, regExp.replace.titleName))
  272. .pipe(replace(regExp.match.version, version))
  273. .pipe(replace(regExp.match.files, filenames))
  274. .pipe(rename(release.files.meteor))
  275. .pipe(gulp.dest(outputDirectory))
  276. ;
  277. })
  278. ;
  279. })
  280. ;
  281. }
  282. tasks.push(gulp.series(
  283. copyDist,
  284. createNpmModule,
  285. extendBower,
  286. createReadme,
  287. extendPackage,
  288. extendComposer,
  289. createReleaseNotes,
  290. createMeteorPackage
  291. ));
  292. })(component);
  293. }
  294. gulp.series(...tasks)(callback);
  295. };