123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /*******************************
- Create Component Repos
- *******************************/
- /*
- This will create individual component repositories for each SUI component
- * copy component files from release
- * create commonjs files as index.js for NPM release
- * create release notes that filter only items related to component
- * custom package.json file from template
- * create bower.json from template
- * create README from template
- * create meteor.js file
- */
- var
- gulp = require('gulp'),
- // node dependencies
- fs = require('fs'),
- path = require('path'),
- // admin dependencies
- concatFileNames = require('gulp-concat-filenames'),
- flatten = require('gulp-flatten'),
- jsonEditor = require('gulp-json-editor'),
- plumber = require('gulp-plumber'),
- rename = require('gulp-rename'),
- replace = require('gulp-replace'),
- tap = require('gulp-tap'),
- // config
- config = require('../../config/user'),
- release = require('../../config/admin/release'),
- project = require('../../config/project/release'),
- // shorthand
- version = project.version,
- output = config.paths.output
- ;
- module.exports = function(callback) {
- var
- stream,
- index,
- tasks = []
- ;
- for(index in release.components) {
- var
- component = release.components[index]
- ;
- // streams... designed to save time and make coding fun...
- (function(component) {
- var
- outputDirectory = path.join(release.outputRoot, component),
- isJavascript = fs.existsSync(output.compressed + component + '.js'),
- isCSS = fs.existsSync(output.compressed + component + '.css'),
- capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
- packageName = release.packageRoot + component,
- repoName = release.componentRepoRoot + capitalizedComponent,
- gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git',
- repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
- concatSettings = {
- newline : '',
- root : outputDirectory,
- prepend : " '",
- append : "',"
- },
- regExp = {
- match : {
- // templated values
- name : '{component}',
- titleName : '{Component}',
- version : '{version}',
- files : '{files}',
- // release notes
- spacedVersions : /(###.*\n)\n+(?=###)/gm,
- spacedLists : /(^- .*\n)\n+(?=^-)/gm,
- trim : /^\s+|\s+$/g,
- unrelatedNotes : new RegExp('^((?!(^.*(' + component + ').*$|###.*)).)*$', 'gmi'),
- whitespace : /\n\s*\n\s*\n/gm,
- // npm
- componentExport : /(.*)\$\.fn\.\w+\s*=\s*function\(([^\)]*)\)\s*{/g,
- componentReference: '$.fn.' + component,
- settingsExport : /\$\.fn\.\w+\.settings\s*=/g,
- settingsReference : /\$\.fn\.\w+\.settings/g,
- trailingComma : /,(?=[^,]*$)/,
- jQuery : /jQuery/g,
- },
- replace : {
- // readme
- name : component,
- titleName : capitalizedComponent,
- // release notes
- spacedVersions : '',
- spacedLists : '$1',
- trim : '',
- unrelatedNotes : '',
- whitespace : '\n\n',
- // npm
- componentExport : 'var _module = module;\n$1module.exports = function($2) {',
- componentReference: '_module.exports',
- settingsExport : 'module.exports.settings =',
- settingsReference : '_module.exports.settings',
- jQuery : 'require("jquery")'
- }
- },
- task = {
- all : component + ' creating',
- repo : component + ' create repo',
- bower : component + ' create bower.json',
- readme : component + ' create README',
- npm : component + ' create NPM Module',
- notes : component + ' create release notes',
- composer : component + ' create composer.json',
- package : component + ' create package.json',
- meteor : component + ' create meteor package.js',
- },
- // paths to includable assets
- manifest = {
- assets : outputDirectory + '/assets/**/' + component + '?(s).*',
- component : outputDirectory + '/' + component + '+(.js|.css)'
- }
- ;
- // copy dist files into output folder adjusting asset paths
- function copyDist() {
- return gulp.src(release.source + component + '.*')
- .pipe(plumber())
- .pipe(flatten())
- .pipe(replace(release.paths.source, release.paths.output))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // create npm module
- function createNpmModule() {
- return gulp.src(release.source + component + '!(*.min|*.map).js')
- .pipe(plumber())
- .pipe(flatten())
- .pipe(replace(regExp.match.componentExport, regExp.replace.componentExport))
- .pipe(replace(regExp.match.componentReference, regExp.replace.componentReference))
- .pipe(replace(regExp.match.settingsExport, regExp.replace.settingsExport))
- .pipe(replace(regExp.match.settingsReference, regExp.replace.settingsReference))
- .pipe(replace(regExp.match.jQuery, regExp.replace.jQuery))
- .pipe(rename('index.js'))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // create readme
- function createReadme() {
- return gulp.src(release.templates.readme)
- .pipe(plumber())
- .pipe(flatten())
- .pipe(replace(regExp.match.name, regExp.replace.name))
- .pipe(replace(regExp.match.titleName, regExp.replace.titleName))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // extend bower.json
- function extendBower() {
- return gulp.src(release.templates.bower)
- .pipe(plumber())
- .pipe(flatten())
- .pipe(jsonEditor(function(bower) {
- bower.name = packageName;
- bower.description = capitalizedComponent + ' - Semantic UI';
- if(isJavascript) {
- if(isCSS) {
- bower.main = [
- component + '.js',
- component + '.css'
- ];
- }
- else {
- bower.main = [
- component + '.js'
- ];
- }
- bower.dependencies = {
- jquery: '>=1.8'
- };
- }
- else {
- bower.main = [
- component + '.css'
- ];
- }
- return bower;
- }))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // extend package.json
- function extendPackage() {
- return gulp.src(release.templates.package)
- .pipe(plumber())
- .pipe(flatten())
- .pipe(jsonEditor(function(npm) {
- if(isJavascript) {
- npm.dependencies = {
- jquery: 'x.x.x'
- };
- npm.main = 'index.js';
- }
- npm.name = packageName;
- if(version) {
- npm.version = version;
- }
- npm.title = 'Semantic UI - ' + capitalizedComponent;
- npm.description = 'Single component release of ' + component;
- npm.repository = {
- type : 'git',
- url : gitURL
- };
- return npm;
- }))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // extend composer.json
- function extendComposer(){
- return gulp.src(release.templates.composer)
- .pipe(plumber())
- .pipe(flatten())
- .pipe(jsonEditor(function(composer) {
- if(isJavascript) {
- composer.dependencies = {
- jquery: 'x.x.x'
- };
- composer.main = component + '.js';
- }
- composer.name = 'semantic/' + component;
- if(version) {
- composer.version = version;
- }
- composer.description = 'Single component release of ' + component;
- return composer;
- }))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // create release notes
- function createReleaseNotes() {
- return gulp.src(release.templates.notes)
- .pipe(plumber())
- .pipe(flatten())
- // Remove release notes for lines not mentioning component
- .pipe(replace(regExp.match.unrelatedNotes, regExp.replace.unrelatedNotes))
- .pipe(replace(regExp.match.whitespace, regExp.replace.whitespace))
- .pipe(replace(regExp.match.spacedVersions, regExp.replace.spacedVersions))
- .pipe(replace(regExp.match.spacedLists, regExp.replace.spacedLists))
- .pipe(replace(regExp.match.trim, regExp.replace.trim))
- .pipe(gulp.dest(outputDirectory))
- ;
- }
- // Creates meteor package.js
- function createMeteorPackage() {
- var
- filenames = ''
- ;
- return gulp.src(manifest.component)
- .pipe(concatFileNames('empty.txt', concatSettings))
- .pipe(tap(function(file) {
- filenames += file.contents;
- }))
- .on('end', function() {
- gulp.src(manifest.assets)
- .pipe(concatFileNames('empty.txt', concatSettings))
- .pipe(tap(function(file) {
- filenames += file.contents;
- }))
- .on('end', function() {
- // remove trailing slash
- filenames = filenames.replace(regExp.match.trailingComma, '').trim();
- gulp.src(release.templates.meteor.component)
- .pipe(plumber())
- .pipe(flatten())
- .pipe(replace(regExp.match.name, regExp.replace.name))
- .pipe(replace(regExp.match.titleName, regExp.replace.titleName))
- .pipe(replace(regExp.match.version, version))
- .pipe(replace(regExp.match.files, filenames))
- .pipe(rename(release.files.meteor))
- .pipe(gulp.dest(outputDirectory))
- ;
- })
- ;
- })
- ;
- }
- tasks.push(gulp.series(
- copyDist,
- createNpmModule,
- extendBower,
- createReadme,
- extendPackage,
- extendComposer,
- createReleaseNotes,
- createMeteorPackage
- ));
- })(component);
- }
- gulp.series(...tasks)(callback);
- };
|