summaryrefslogtreecommitdiffstats
path: root/src/wwwroot/libraries/fomantic/tasks/admin
diff options
context:
space:
mode:
authorivar <i@oiee.no>2025-10-19 23:41:23 +0200
committerivar <i@oiee.no>2025-10-19 23:41:23 +0200
commit3f4c0720e1e3421431e7baa20882a4a4512a7fab (patch)
tree734ca81d7d0841d8863e3f523ebba14c282dc681 /src/wwwroot/libraries/fomantic/tasks/admin
downloadfagprove-3f4c0720e1e3421431e7baa20882a4a4512a7fab.tar.xz
fagprove-3f4c0720e1e3421431e7baa20882a4a4512a7fab.zip
InitialHEADmaster
Diffstat (limited to 'src/wwwroot/libraries/fomantic/tasks/admin')
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/components/create.js319
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/components/init.js169
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/components/update.js182
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js208
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js168
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js177
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/publish.js24
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/register.js55
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/admin/release.js28
9 files changed, 1330 insertions, 0 deletions
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/components/create.js b/src/wwwroot/libraries/fomantic/tasks/admin/components/create.js
new file mode 100644
index 0000000..58e377f
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/components/create.js
@@ -0,0 +1,319 @@
+/*******************************
+ 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);
+};
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/components/init.js b/src/wwwroot/libraries/fomantic/tasks/admin/components/init.js
new file mode 100644
index 0000000..c9f627a
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/components/init.js
@@ -0,0 +1,169 @@
+/*******************************
+ Init Repos
+*******************************/
+
+/*
+
+ This task pulls the latest version of each component from GitHub
+
+ * Creates new repo if doesnt exist (locally & GitHub)
+ * Adds remote it doesnt exists
+ * Pulls latest changes from repo
+
+*/
+
+var
+ gulp = require('gulp'),
+
+ // node dependencies
+ console = require('better-console'),
+ del = require('del'),
+ fs = require('fs'),
+ path = require('path'),
+ git = require('gulp-git'),
+ mkdirp = require('mkdirp'),
+
+ // admin files
+ github = require('../../config/admin/github.js'),
+ release = require('../../config/admin/release'),
+ project = require('../../config/project/release'),
+
+
+ // oAuth configuration for GitHub
+ oAuth = fs.existsSync(__dirname + '/../../config/admin/oauth.js')
+ ? require('../../config/admin/oauth')
+ : false,
+
+ // shorthand
+ version = project.version
+;
+
+module.exports = function(callback) {
+
+ var
+ index = -1,
+ total = release.components.length,
+ timer,
+ stream,
+ stepRepo
+ ;
+
+ if(!oAuth) {
+ console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');
+ return;
+ }
+
+ // Do Git commands synchronously per component, to avoid issues
+ stepRepo = function() {
+
+ index = index + 1;
+
+ if(index >= total) {
+ callback();
+ return;
+ }
+
+ var
+ component = release.components[index],
+ outputDirectory = path.resolve(release.outputRoot + component),
+ capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
+ repoName = release.componentRepoRoot + capitalizedComponent,
+
+ gitOptions = { cwd: outputDirectory },
+ pullOptions = { args: '-q', cwd: outputDirectory, quiet: true },
+ resetOptions = { args: '-q --hard', cwd: outputDirectory, quiet: true },
+
+ gitURL = 'git@github.com:' + release.org + '/' + repoName + '.git',
+ repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
+ localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git'))
+ ;
+
+ console.log('Processing repository: ' + outputDirectory);
+
+ // create folder if doesn't exist
+ if( !fs.existsSync(outputDirectory) ) {
+ mkdirp.sync(outputDirectory);
+ }
+
+ // clean folder
+ if(release.outputRoot.search('../repos') == 0) {
+ console.info('Cleaning dir', outputDirectory);
+ del.sync([outputDirectory + '**/*'], {silent: true, force: true});
+ }
+
+ // set-up local repo
+ function setupRepo() {
+ if(localRepoSetup) {
+ addRemote();
+ }
+ else {
+ initRepo();
+ }
+ }
+
+ function initRepo() {
+ console.info('Initializing repository for ' + component);
+ git.init(gitOptions, function(error) {
+ if(error) {
+ console.error('Error initializing repo', error);
+ }
+ addRemote();
+ });
+ }
+
+ function createRepo() {
+ console.info('Creating GitHub repo ' + repoURL);
+ github.repos.createFromOrg({
+ org : release.org,
+ name : repoName,
+ homepage : release.homepage
+ }, function() {
+ setupRepo();
+ });
+ }
+
+ function addRemote() {
+ console.info('Adding remote origin as ' + gitURL);
+ git.addRemote('origin', gitURL, gitOptions, function(){
+ pullFiles();
+ });
+ }
+
+ function pullFiles() {
+ console.info('Pulling ' + component + ' files');
+ git.pull('origin', 'master', pullOptions, function(error) {
+ resetFiles();
+ });
+ }
+
+ function resetFiles() {
+ console.info('Resetting files to head');
+ git.reset('HEAD', resetOptions, function(error) {
+ nextRepo();
+ });
+ }
+
+ function nextRepo() {
+ //console.log('Sleeping for 1 second...');
+ // avoid rate throttling
+ global.clearTimeout(timer);
+ timer = global.setTimeout(function() {
+ stepRepo()
+ }, 0);
+ }
+
+
+ if(localRepoSetup) {
+ pullFiles();
+ }
+ else {
+ setupRepo();
+ // createRepo() only use to create remote repo (easier to do manually)
+ }
+
+ };
+
+ stepRepo();
+
+
+};
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/components/update.js b/src/wwwroot/libraries/fomantic/tasks/admin/components/update.js
new file mode 100644
index 0000000..276c9e2
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/components/update.js
@@ -0,0 +1,182 @@
+/*******************************
+ Update Repos
+*******************************/
+
+/*
+
+ This task update all SUI individual component repos with new versions of components
+
+ * Commits changes from create repo
+ * Pushes changes to GitHub
+ * Tag new releases if version changed in main repo
+
+*/
+
+var
+ gulp = require('gulp'),
+
+ // node dependencies
+ console = require('better-console'),
+ fs = require('fs'),
+ path = require('path'),
+ git = require('gulp-git'),
+
+ // admin files
+ github = require('../../config/admin/github.js'),
+ release = require('../../config/admin/release'),
+ project = require('../../config/project/release'),
+
+
+ // oAuth configuration for GitHub
+ oAuth = fs.existsSync(__dirname + '/../../config/admin/oauth.js')
+ ? require('../../config/admin/oauth')
+ : false,
+
+ // shorthand
+ version = project.version
+;
+
+module.exports = function(callback) {
+
+ var
+ index = -1,
+ total = release.components.length,
+ timer,
+ stream,
+ stepRepo
+ ;
+
+ if(!oAuth) {
+ console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');
+ return;
+ }
+
+ // Do Git commands synchronously per component, to avoid issues
+ stepRepo = function() {
+
+ index = index + 1;
+ if(index >= total) {
+ callback();
+ return;
+ }
+
+ var
+ component = release.components[index],
+ outputDirectory = path.resolve(path.join(release.outputRoot, component)),
+ capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
+ repoName = release.componentRepoRoot + capitalizedComponent,
+
+ gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git',
+ repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
+
+ commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined)
+ ? '--author "' + oAuth.name + ' <' + oAuth.email + '>"'
+ : '',
+
+ componentPackage = fs.existsSync(outputDirectory + 'package.json' )
+ ? require(outputDirectory + 'package.json')
+ : false,
+
+ isNewVersion = (version && componentPackage.version != version),
+
+ commitMessage = (isNewVersion)
+ ? 'Updated component to version ' + version
+ : 'Updated files from main repo',
+
+ gitOptions = { cwd: outputDirectory },
+ commitOptions = { args: commitArgs, cwd: outputDirectory },
+ releaseOptions = { tag_name: version, owner: release.org, repo: repoName },
+
+ fileModeOptions = { args : 'config core.fileMode false', cwd: outputDirectory },
+ usernameOptions = { args : 'config user.name "' + oAuth.name + '"', cwd: outputDirectory },
+ emailOptions = { args : 'config user.email "' + oAuth.email + '"', cwd: outputDirectory },
+ versionOptions = { args : 'rev-parse --verify HEAD', cwd: outputDirectory },
+
+ localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git')),
+ canProceed = true
+ ;
+
+
+ console.info('Processing repository:' + outputDirectory);
+
+ function setConfig() {
+ git.exec(fileModeOptions, function() {
+ git.exec(usernameOptions, function () {
+ git.exec(emailOptions, function () {
+ commitFiles();
+ });
+ });
+ });
+ }
+
+
+ // standard path
+ function commitFiles() {
+ // commit files
+ console.info('Committing ' + component + ' files', commitArgs);
+ gulp.src('./', gitOptions)
+ .pipe(git.add(gitOptions))
+ .pipe(git.commit(commitMessage, commitOptions))
+ .on('error', function(error) {
+ // canProceed = false; bug in git commit <https://github.com/stevelacy/gulp-git/issues/49>
+ })
+ .on('finish', function(callback) {
+ if(canProceed) {
+ pushFiles();
+ }
+ else {
+ console.info('Nothing new to commit');
+ nextRepo();
+ }
+ })
+ ;
+ }
+
+ // push changes to remote
+ function pushFiles() {
+ console.info('Pushing files for ' + component);
+ git.push('origin', 'master', { args: '', cwd: outputDirectory }, function(error) {
+ console.info('Push completed successfully');
+ getSHA();
+ });
+ }
+
+ // gets SHA of last commit
+ function getSHA() {
+ git.exec(versionOptions, function(error, version) {
+ version = version.trim();
+ createRelease(version);
+ });
+ }
+
+ // create release on GitHub.com
+ function createRelease(version) {
+ if(version) {
+ releaseOptions.target_commitish = version;
+ }
+ github.repos.createRelease(releaseOptions, function() {
+ nextRepo();
+ });
+ }
+
+ // Steps to next repository
+ function nextRepo() {
+ console.log('Sleeping for 1 second...');
+ // avoid rate throttling
+ global.clearTimeout(timer);
+ timer = global.setTimeout(stepRepo, 100);
+ }
+
+
+ if(localRepoSetup) {
+ setConfig();
+ }
+ else {
+ console.error('Repository must be setup before running update components');
+ }
+
+ };
+
+ stepRepo();
+
+};
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js
new file mode 100644
index 0000000..6fe6921
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/create.js
@@ -0,0 +1,208 @@
+/*******************************
+ Create Distributions
+*******************************/
+
+/*
+ This will create individual distribution repositories for each SUI distribution
+
+ * copy distribution files to release
+ * update package.json file
+*/
+
+var
+ gulp = require('gulp'),
+
+ // node dependencies
+ fs = require('fs'),
+ path = require('path'),
+ mergeStream = require('merge-stream'),
+
+ // admin dependencies
+ flatten = require('gulp-flatten'),
+ jsonEditor = require('gulp-json-editor'),
+ plumber = require('gulp-plumber'),
+ rename = require('gulp-rename'),
+ replace = require('gulp-replace'),
+
+ // 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.distributions) {
+
+ var
+ distribution = release.distributions[index]
+ ;
+
+ // streams... designed to save time and make coding fun...
+ (function(distribution) {
+
+ var
+ distLowerCase = distribution.toLowerCase(),
+ outputDirectory = path.join(release.outputRoot, distLowerCase),
+ packageFile = path.join(outputDirectory, release.files.npm),
+ repoName = release.distRepoRoot + distribution,
+ regExp = {
+ match : {
+ files : '{files}',
+ version : '{version}'
+ }
+ },
+ task = {
+ all : distribution + ' copying files',
+ repo : distribution + ' create repo',
+ meteor : distribution + ' create meteor package.js',
+ package : distribution + ' create package.json'
+ },
+ gatherFiles,
+ createList
+ ;
+
+ // get files for meteor
+ gatherFiles = function(dir) {
+ var
+ dir = dir || path.resolve('.'),
+ list = fs.readdirSync(dir),
+ omitted = [
+ '.git',
+ 'node_modules',
+ 'package.js',
+ 'LICENSE',
+ 'README.md',
+ 'package.json',
+ 'bower.json',
+ '.gitignore'
+ ],
+ files = []
+ ;
+ list.forEach(function(file) {
+ var
+ isOmitted = (omitted.indexOf(file) > -1),
+ filePath = path.join(dir, file),
+ stat = fs.statSync(filePath)
+ ;
+ if(!isOmitted) {
+ if(stat && stat.isDirectory()) {
+ files = files.concat(gatherFiles(filePath));
+ }
+ else {
+ files.push(filePath.replace(outputDirectory + path.sep, ''));
+ }
+ }
+ });
+ return files;
+ };
+
+ // spaces out list correctly
+ createList = function(files) {
+ var filenames = '';
+ for(var file in files) {
+ if(file == (files.length - 1) ) {
+ filenames += "'" + files[file] + "'";
+ }
+ else {
+ filenames += "'" + files[file] + "',\n ";
+ }
+ }
+ return filenames;
+ };
+
+ tasks.push(function() {
+ var
+ files = gatherFiles(outputDirectory),
+ filenames = createList(files)
+ ;
+ gulp.src(release.templates.meteor[distLowerCase])
+ .pipe(plumber())
+ .pipe(flatten())
+ .pipe(replace(regExp.match.version, version))
+ .pipe(replace(regExp.match.files, filenames))
+ .pipe(rename(release.files.meteor))
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ });
+
+ if(distribution == 'CSS') {
+ tasks.push(function() {
+ var
+ themes,
+ components,
+ releases
+ ;
+ themes = gulp.src('dist/themes/default/**/*', { base: 'dist/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ components = gulp.src('dist/components/*', { base: 'dist/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ releases = gulp.src('dist/*', { base: 'dist/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ return mergeStream(themes, components, releases);
+ });
+ }
+ else if(distribution == 'LESS') {
+ tasks.push(function() {
+ var
+ definitions,
+ themeImport,
+ themeConfig,
+ siteTheme,
+ themes
+ ;
+ definitions = gulp.src('src/definitions/**/*', { base: 'src/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ themeImport = gulp.src('src/semantic.less', { base: 'src/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ themeImport = gulp.src('src/theme.less', { base: 'src/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ themeConfig = gulp.src('src/theme.config.example', { base: 'src/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ siteTheme = gulp.src('src/_site/**/*', { base: 'src/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ themes = gulp.src('src/themes/**/*', { base: 'src/' })
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ return mergeStream(definitions, themeImport, themeConfig, siteTheme, themes);
+ });
+ }
+
+ // extend package.json
+ tasks.push(function() {
+ return gulp.src(packageFile)
+ .pipe(plumber())
+ .pipe(jsonEditor(function(package) {
+ if(version) {
+ package.version = version;
+ }
+ return package;
+ }))
+ .pipe(gulp.dest(outputDirectory))
+ ;
+ });
+
+ })(distribution);
+ }
+
+ gulp.series(...tasks)(callback);
+}; \ No newline at end of file
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js
new file mode 100644
index 0000000..124e131
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/init.js
@@ -0,0 +1,168 @@
+/*******************************
+ Init Dist Repos
+*******************************/
+
+/*
+
+ This task pulls the latest version of distribution from GitHub
+
+ * Creates new repo if doesnt exist (locally & GitHub)
+ * Adds remote it doesnt exists
+ * Pulls latest changes from repo
+
+*/
+
+var
+ gulp = require('gulp'),
+
+ // node dependencies
+ console = require('better-console'),
+ del = require('del'),
+ fs = require('fs'),
+ path = require('path'),
+ git = require('gulp-git'),
+ mkdirp = require('mkdirp'),
+
+ // admin files
+ github = require('../../config/admin/github.js'),
+ release = require('../../config/admin/release'),
+ project = require('../../config/project/release'),
+
+
+ // oAuth configuration for GitHub
+ oAuth = fs.existsSync(__dirname + '/../../config/admin/oauth.js')
+ ? require('../../config/admin/oauth')
+ : false,
+
+ // shorthand
+ version = project.version
+;
+
+module.exports = function(callback) {
+
+ var
+ index = -1,
+ total = release.distributions.length,
+ timer,
+ stream,
+ stepRepo
+ ;
+
+ if(!oAuth) {
+ console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');
+ return;
+ }
+
+ // Do Git commands synchronously per component, to avoid issues
+ stepRepo = function() {
+
+ index = index + 1;
+
+ if(index >= total) {
+ callback();
+ return;
+ }
+
+ var
+ component = release.distributions[index],
+ lowerCaseComponent = component.toLowerCase(),
+ outputDirectory = path.resolve(release.outputRoot + lowerCaseComponent),
+ repoName = release.distRepoRoot + component,
+
+ gitOptions = { cwd: outputDirectory },
+ pullOptions = { args: '-q', cwd: outputDirectory, quiet: true },
+ resetOptions = { args: '-q --hard', cwd: outputDirectory, quiet: true },
+ gitURL = 'git@github.com:' + release.org + '/' + repoName + '.git',
+ repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
+ localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git'))
+ ;
+
+ console.log('Processing repository: ' + outputDirectory);
+
+ // create folder if doesn't exist
+ if( !fs.existsSync(outputDirectory) ) {
+ mkdirp.sync(outputDirectory);
+ }
+
+ // clean folder
+ if(release.outputRoot.search('../repos') == 0) {
+ console.info('Cleaning dir', outputDirectory);
+ del.sync([outputDirectory + '**/*'], {silent: true, force: true});
+ }
+
+ // set-up local repo
+ function setupRepo() {
+ if(localRepoSetup) {
+ addRemote();
+ }
+ else {
+ initRepo();
+ }
+ }
+
+ function initRepo() {
+ console.info('Initializing repository for ' + component);
+ git.init(gitOptions, function(error) {
+ if(error) {
+ console.error('Error initializing repo', error);
+ }
+ addRemote();
+ });
+ }
+
+ function createRepo() {
+ console.info('Creating GitHub repo ' + repoURL);
+ github.repos.createFromOrg({
+ org : release.org,
+ name : repoName,
+ homepage : release.homepage
+ }, function() {
+ setupRepo();
+ });
+ }
+
+ function addRemote() {
+ console.info('Adding remote origin as ' + gitURL);
+ git.addRemote('origin', gitURL, gitOptions, function(){
+ pullFiles();
+ });
+ }
+
+ function pullFiles() {
+ console.info('Pulling ' + component + ' files');
+ git.pull('origin', 'master', pullOptions, function(error) {
+ resetFiles();
+ });
+ }
+
+ function resetFiles() {
+ console.info('Resetting files to head');
+ git.reset('HEAD', resetOptions, function(error) {
+ nextRepo();
+ });
+ }
+
+ function nextRepo() {
+ //console.log('Sleeping for 1 second...');
+ // avoid rate throttling
+ global.clearTimeout(timer);
+ timer = global.setTimeout(function() {
+ stepRepo()
+ }, 0);
+ }
+
+
+ if(localRepoSetup) {
+ pullFiles();
+ }
+ else {
+ setupRepo();
+ // createRepo() only use to create remote repo (easier to do manually)
+ }
+
+ };
+
+ stepRepo();
+
+
+};
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js
new file mode 100644
index 0000000..bc3614b
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/distributions/update.js
@@ -0,0 +1,177 @@
+/*******************************
+ Update Repos
+*******************************/
+
+/*
+
+ This task update all SUI individual distribution repos with new versions of distributions
+
+ * Commits changes from create repo
+ * Pushes changes to GitHub
+ * Tag new releases if version changed in main repo
+
+*/
+
+var
+ gulp = require('gulp'),
+
+ // node dependencies
+ console = require('better-console'),
+ fs = require('fs'),
+ path = require('path'),
+ git = require('gulp-git'),
+
+ // admin files
+ github = require('../../config/admin/github.js'),
+ release = require('../../config/admin/release'),
+ project = require('../../config/project/release'),
+
+
+ // oAuth configuration for GitHub
+ oAuth = fs.existsSync(__dirname + '/../../config/admin/oauth.js')
+ ? require('../../config/admin/oauth')
+ : false,
+
+ // shorthand
+ version = project.version
+;
+
+module.exports = function(callback) {
+
+ var
+ index = -1,
+ total = release.distributions.length,
+ timer,
+ stream,
+ stepRepo
+ ;
+
+ if(!oAuth) {
+ console.error('Must add oauth token for GitHub in tasks/config/admin/oauth.js');
+ return;
+ }
+
+ // Do Git commands synchronously per distribution, to avoid issues
+ stepRepo = function() {
+
+ index = index + 1;
+ if(index >= total) {
+ callback();
+ return;
+ }
+
+ var
+ distribution = release.distributions[index],
+ outputDirectory = path.resolve(path.join(release.outputRoot, distribution.toLowerCase() )),
+ repoName = release.distRepoRoot + distribution,
+
+ commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined)
+ ? '--author "' + oAuth.name + ' <' + oAuth.email + '>"'
+ : '',
+
+ distributionPackage = fs.existsSync(outputDirectory + 'package.json' )
+ ? require(outputDirectory + 'package.json')
+ : false,
+
+ isNewVersion = (version && distributionPackage.version != version),
+
+ commitMessage = (isNewVersion)
+ ? 'Updated distribution to version ' + version
+ : 'Updated files from main repo',
+
+ gitOptions = { cwd: outputDirectory },
+ commitOptions = { args: commitArgs, cwd: outputDirectory },
+ releaseOptions = { tag_name: version, owner: release.org, repo: repoName },
+
+ fileModeOptions = { args : 'config core.fileMode false', cwd: outputDirectory },
+ usernameOptions = { args : 'config user.name "' + oAuth.name + '"', cwd: outputDirectory },
+ emailOptions = { args : 'config user.email "' + oAuth.email + '"', cwd: outputDirectory },
+ versionOptions = { args : 'rev-parse --verify HEAD', cwd: outputDirectory },
+
+ localRepoSetup = fs.existsSync(path.join(outputDirectory, '.git')),
+ canProceed = true
+ ;
+
+
+ console.info('Processing repository:' + outputDirectory);
+
+ function setConfig() {
+ git.exec(fileModeOptions, function() {
+ git.exec(usernameOptions, function () {
+ git.exec(emailOptions, function () {
+ commitFiles();
+ });
+ });
+ });
+ }
+
+ // standard path
+ function commitFiles() {
+ // commit files
+ console.info('Committing ' + distribution + ' files', commitArgs);
+ gulp.src('./', gitOptions)
+ .pipe(git.add(gitOptions))
+ .pipe(git.commit(commitMessage, commitOptions))
+ .on('error', function(error) {
+ // canProceed = false; bug in git commit <https://github.com/stevelacy/gulp-git/issues/49>
+ })
+ .on('finish', function(callback) {
+ if(canProceed) {
+ pushFiles();
+ }
+ else {
+ console.info('Nothing new to commit');
+ nextRepo();
+ }
+ })
+ ;
+ }
+
+ // push changes to remote
+ function pushFiles() {
+ console.info('Pushing files for ' + distribution);
+ git.push('origin', 'master', { args: '', cwd: outputDirectory }, function(error) {
+ console.info('Push completed successfully');
+ getSHA();
+ });
+ }
+
+ // gets SHA of last commit
+ function getSHA() {
+ git.exec(versionOptions, function(error, version) {
+ version = version.trim();
+ createRelease(version);
+ });
+ }
+
+ // create release on GitHub.com
+ function createRelease(version) {
+ if(version) {
+ releaseOptions.target_commitish = version;
+ }
+ github.repos.createRelease(releaseOptions, function() {
+ nextRepo();
+ });
+ }
+
+ // Steps to next repository
+ function nextRepo() {
+ console.log('Sleeping for 1 second...');
+ // avoid rate throttling
+ global.clearTimeout(timer);
+ timer = global.setTimeout(stepRepo, 100);
+ }
+
+
+ if(localRepoSetup) {
+ setConfig();
+ }
+ else {
+ console.error('Repository must be setup before running update distributions');
+ }
+
+ };
+
+ stepRepo();
+
+};
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/publish.js b/src/wwwroot/libraries/fomantic/tasks/admin/publish.js
new file mode 100644
index 0000000..f969e17
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/publish.js
@@ -0,0 +1,24 @@
+/*******************************
+ * Release All
+ *******************************/
+
+/*
+ This task update all SUI individual component repos with new versions of components
+
+ * Commits changes from create components to GitHub and Tags
+
+*/
+
+var
+ gulp = require('gulp')
+;
+
+/* Release All */
+module.exports = function (callback) {
+
+ gulp.series(
+ 'update distributions', // commit less/css versions to github
+ 'update components', // commit components to github
+ )(callback);
+
+}; \ No newline at end of file
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/register.js b/src/wwwroot/libraries/fomantic/tasks/admin/register.js
new file mode 100644
index 0000000..d45dd29
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/register.js
@@ -0,0 +1,55 @@
+/*******************************
+ Register PM
+*******************************/
+
+/*
+ Task to register component repos with Package Managers
+ * Registers component with bower
+ * Registers component with NPM
+*/
+
+var
+ // node dependencies
+ process = require('child_process'),
+
+ // config
+ release = require('../config/admin/release'),
+
+ // register components and distributions
+ repos = release.distributions.concat(release.components),
+ total = repos.length,
+ index = -1,
+
+ stream,
+ stepRepo
+;
+
+module.exports = function(callback) {
+
+ console.log('Registering repos with package managers');
+
+ // Do Git commands synchronously per component, to avoid issues
+ stepRepo = function() {
+ index = index + 1;
+ if(index >= total) {
+ callback();
+ return;
+ }
+ var
+ repo = repos[index].toLowerCase(),
+ outputDirectory = release.outputRoot + repo + '/',
+ exec = process.exec,
+ execSettings = {cwd: outputDirectory},
+ updateNPM = 'npm publish;meteor publish;'
+ ;
+
+ /* Register with NPM */
+ exec(updateNPM, execSettings, function(err, stdout, stderr) {
+ console.log(err, stdout, stderr);
+ stepRepo();
+ });
+
+ };
+ stepRepo();
+};
+
diff --git a/src/wwwroot/libraries/fomantic/tasks/admin/release.js b/src/wwwroot/libraries/fomantic/tasks/admin/release.js
new file mode 100644
index 0000000..87962af
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/admin/release.js
@@ -0,0 +1,28 @@
+/*******************************
+ * Release
+ *******************************/
+
+/*
+ This task update all SUI individual component repos with new versions of components
+
+ * Initializes repositories with current versions
+ * Creates local files at ../distributions/ with each repo for release
+
+*/
+
+var
+ gulp = require('gulp')
+;
+
+/* Release All */
+module.exports = function (callback) {
+
+ gulp.series(
+ //'build', // build Semantic
+ 'init distributions', // sync with current github version
+ 'create distributions', // update each repo with changes from master repo
+ 'init components', // sync with current github version
+ 'create components', // update each repo
+ )(callback);
+
+}; \ No newline at end of file