Browse Source

Stubs out all missing task files

pull/1785/head
jlukic 10 years ago
parent
commit
5065dbd1fb
28 changed files with 1344 additions and 1302 deletions
  1. 2
      dist/components/accordion.min.js
  2. 2
      dist/components/form.min.js
  3. 2
      dist/components/reset.css
  4. 2
      dist/components/reset.min.css
  5. 2
      dist/components/site.css
  6. 2
      dist/components/site.min.css
  7. 2
      dist/components/site.min.js
  8. 29
      gulpfile.js
  9. 5
      tasks/admin/config/oauth.example.js
  10. 86
      tasks/admin/config/release.js
  11. 311
      tasks/admin/create-repos.js
  12. 19
      tasks/admin/docs.json
  13. 50
      tasks/admin/questions.js
  14. 44
      tasks/admin/register-repos.js
  15. 28
      tasks/admin/release-all.js
  16. 92
      tasks/admin/release.js
  17. 161
      tasks/admin/update-repos.js
  18. 130
      tasks/build-rtl.js
  19. 1
      tasks/build.js
  20. 11
      tasks/check-install.js
  21. 25
      tasks/config/project/docs.js
  22. 4
      tasks/config/project/release.js
  23. 150
      tasks/install.js
  24. 85
      tasks/internal.js
  25. 21
      tasks/serve-docs.js
  26. 220
      tasks/watch-rtl.js
  27. 66
      tasks/watch.js
  28. 1094
      temp.js

2
dist/components/accordion.min.js

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

2
dist/components/form.min.js

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

2
dist/components/reset.css

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

2
dist/components/reset.min.css

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

2
dist/components/site.css

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

2
dist/components/site.min.css

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

2
dist/components/site.min.js

@ -1,5 +1,5 @@
/*
* # Semantic UI - 1.8.1
* # Semantic UI -
* https://github.com/Semantic-Org/Semantic-UI
* http://www.semantic-ui.com/
*

29
gulpfile.js

@ -3,30 +3,25 @@
*******************************/
var
gulp = require('gulp-help')(require('gulp')),
config = require('./tasks/config/user')
gulp = require('gulp-help')(require('gulp')),
config = require('./tasks/config/user'),
// import tasks
watch = require('./tasks/watch'),
build = require('./tasks/build'),
clean = require('./tasks/clean'),
version = require('./tasks/version')
;
/*******************************
Tasks
*******************************/
/*
All tasks are defined in sub-folder "tasks/"
*/
gulp.task('watch', 'Watch for site/theme changes', watch);
gulp.task('build', 'Builds all files from source', build);
gulp.task('clean', 'Clean dist folder', clean);
gulp.task('version', 'Displays current version of Semantic', version);
gulp.task('default', false, [
'check install'
]);
gulp.task('watch', 'Watch for site/theme changes', require('./tasks/watch'));
gulp.task('build', 'Builds all files from source', require('./tasks/build'));
gulp.task('clean', 'Clean dist folder', require('./tasks/clean'));
gulp.task('version', 'Displays current version of Semantic', require('./tasks/version'));
if(config.admin) {
}

tasks/admin/oauth.example.js → tasks/admin/config/oauth.example.js

@ -1,3 +1,8 @@
/*
Used to import GitHub Auth Token
To Automate GitHub Updates
*/
module.exports = {
token : 'AN-OAUTH2-TOKEN',
name : 'Your Name',

86
tasks/admin/config/release.js

@ -0,0 +1,86 @@
/*******************************
Release Settings
*******************************/
// release settings
module.exports = {
// path to components for repos
source : './dist/components/',
// modified asset paths for component repos
paths: {
source : '../themes/default/assets/',
output : 'assets/'
},
templates: {
bower : './tasks/admin/templates/bower.json',
composer : './tasks/admin/templates/composer.json',
package : './tasks/admin/templates/package.json',
meteor : './tasks/admin/templates/package.js',
meteorComponent : './tasks/admin/templates/package-component.js',
readme : './tasks/admin/templates/README.md',
notes : './RELEASE-NOTES.md'
},
org : 'Semantic-Org',
repo : 'Semantic-UI',
// root name for repos
repoRoot : 'UI-',
packageRoot : 'semantic-ui-',
// root path to repos
outputRoot : '../components/',
homepage : 'http://www.semantic-ui.com',
// components that get separate repositories for bower/npm
components : [
'accordion',
'api',
'breadcrumb',
'button',
'card',
'checkbox',
'comment',
'dimmer',
'divider',
'dropdown',
'feed',
'flag',
'form',
'grid',
'header',
'icon',
'image',
'input',
'item',
'label',
'list',
'loader',
'menu',
'message',
'modal',
'nag',
'popup',
'progress',
'rail',
'rating',
'reset',
'reveal',
'search',
'segment',
'shape',
'sidebar',
'site',
'statistic',
'step',
'sticky',
'tab',
'table',
'transition',
'video'
]
};

311
tasks/admin/create-repos.js

@ -0,0 +1,311 @@
/*******************************
Create 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
// admin dependencies
concatFileNames = require('gulp-concat-filenames'),
git = require('gulp-git'),
githubAPI = require('github'),
runSequence = require('run-sequence'),
tap = require('gulp-tap'),
// admin files
release = require('./tasks/admin/release'),
// stores oauth info for GitHub API
oAuth = fs.existsSync('./tasks/admin/oauth.js')
? require('./tasks/admin/oauth')
: false,
github
;
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 = 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.repoRoot + capitalizedComponent,
gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git',
repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
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
export : /\$\.fn\.\w+\s*=\s*function\(parameters\)\s*{/g,
formExport : /\$\.fn\.\w+\s*=\s*function\(fields, parameters\)\s*{/g,
settingsExport : /\$\.fn\.\w+\.settings\s*=/g,
settingsReference : /\$\.fn\.\w+\.settings/g,
jQuery : /jQuery/g,
},
replace : {
// readme
name : component,
titleName : capitalizedComponent,
// release notes
spacedVersions : '',
spacedLists : '$1',
trim : '',
unrelatedNotes : '',
whitespace : '\n\n',
// npm
export : 'module.exports = function(parameters) {\n var _module = module;\n',
formExport : 'module.exports = function(fields, parameters) {\n var _module = module;\n',
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 package.js',
}
;
// copy dist files into output folder adjusting asset paths
gulp.task(task.repo, false, function() {
return gulp.src(release.source + component + '.*')
.pipe(plumber())
.pipe(flatten())
.pipe(replace(release.paths.source, release.paths.output))
.pipe(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// create npm module
gulp.task(task.npm, false, function() {
return gulp.src(release.source + component + '!(*.min|*.map).js')
.pipe(plumber())
.pipe(flatten())
.pipe(replace(regExp.match.export, regExp.replace.export))
.pipe(replace(regExp.match.formExport, regExp.replace.formExport))
.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(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// create readme
gulp.task(task.readme, false, function() {
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(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// extend bower.json
gulp.task(task.bower, false, function() {
return gulp.src(release.templates.bower)
.pipe(plumber())
.pipe(flatten())
.pipe(jeditor(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(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// extend package.json
gulp.task(task.package, false, function() {
return gulp.src(release.templates.package)
.pipe(plumber())
.pipe(flatten())
.pipe(jeditor(function(package) {
if(isJavascript) {
package.dependencies = {
jquery: 'x.x.x'
};
package.main = 'index.js';
}
package.name = packageName;
if(version) {
package.version = version;
}
package.title = 'Semantic UI - ' + capitalizedComponent;
package.description = 'Single component release of ' + component;
package.repository = {
type : 'git',
url : gitURL
};
return package;
}))
.pipe(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// extend composer.json
gulp.task(task.composer, false, function() {
return gulp.src(release.templates.composer)
.pipe(plumber())
.pipe(flatten())
.pipe(jeditor(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(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// create release notes
gulp.task(task.notes, false, function() {
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(chmod(config.permission))
.pipe(gulp.dest(outputDirectory))
;
});
// Creates meteor package.js
gulp.task(task.meteor, function() {
var
fileNames = ''
;
if(isJavascript) {
fileNames += ' \'' + component + '.js\',\n';
}
if(isCSS) {
fileNames += ' \'' + component + '.css\',\n';
}
return gulp.src(outputDirectory + '/assets/**/' + component + '?(s).*', { base: outputDirectory})
.pipe(concatFileNames('dummy.txt', {
newline : '',
root : outputDirectory,
prepend : ' \'',
append : '\','
}))
.pipe(tap(function(file) { fileNames += file.contents; }))
.on('end', function(){
gulp.src(release.templates.meteorComponent)
.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(defaults.files.npm))
.pipe(gulp.dest(outputDirectory))
;
})
;
});
// synchronous tasks in orchestrator? I think not
gulp.task(task.all, false, function(callback) {
runSequence([
task.repo,
task.npm,
task.bower,
task.readme,
task.package,
task.composer,
task.notes,
task.meteor
], callback);
});
tasks.push(task.all);
})(component);
}
runSequence(tasks, callback);
});

19
tasks/admin/docs.json

@ -1,19 +0,0 @@
{
"base": "",
"paths": {
"source": {
"config": "src/theme.config",
"definitions": "src/definitions/",
"site": "src/site/",
"themes": "src/themes/"
},
"output": {
"less": "../docs/out/src/",
"packaged": "../docs/out/dist/",
"uncompressed": "../docs/out/dist/components/",
"compressed": "../docs/out/dist/components/",
"themes": "../docs/out/dist/themes/"
},
"clean": "../docs/out/dist/"
}
}

50
tasks/admin/questions.js

@ -1,50 +0,0 @@
/*******************************
Install Questions
*******************************/
var defaults, fs, filter, when;
fs = require('fs');
defaults = require('../defaults');
filter = {
removeTrailingSlash: function(path) {
return path.replace(/(\/$|\\$)+/mg, '');
}
};
when = {
};
module.exports = {
docs: [
{
type: 'list',
name: 'action',
message: 'How should we provide files to docs?',
choices: [
{
name: 'Watch changes',
value: 'docs-serve'
},
{
name: 'Build all files',
value: 'docs-build'
}
]
}
],
createRepo: [
{
type: 'confirm',
name: 'allow',
message: 'Create new repo?',
default: true
}
]
};

44
tasks/admin/register-repos.js

@ -0,0 +1,44 @@
gulp.task('register repos', false, function(callback) {
var
index = -1,
total = release.components.length,
process = require('child_process'),
stream,
stepRepo
;
console.log('Registering repos with package managers');
// Do Git commands synchronously per component, to avoid issues
stepRepo = function() {
index = index + 1;
if(index >= total) {
return;
}
var
component = release.components[index],
outputDirectory = release.outputRoot + component + '/',
capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
packageName = release.packageRoot + component,
repoName = release.repoRoot + capitalizedComponent,
gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git',
exec = process.exec,
execSettings = {cwd: outputDirectory},
registerBower = 'bower register ' + packageName + ' ' + gitURL,
registerNPM = 'npm publish'
;
/* One time register
exec(registerBower, execSettings, function(err, stdout, stderr) {
stepRepo();
});
*/
/* Update npm
exec(registerNPM, execSettings, function(err, stdout, stderr) {
console.log(err, stdout, stderr);
stepRepo();
});
*/
};
stepRepo();
});

28
tasks/admin/release-all.js

@ -0,0 +1,28 @@
/* Release All */
gulp.task('release all', false, function() {
if(!oAuth) {
console.error('Must add node include tasks/admin/oauth.js with oauth token for GitHub');
return;
}
github = new githubAPI({
version : '3.0.0',
debug : true,
protocol : 'https',
timeout : 5000
});
github.authenticate({
type: 'oauth',
token: oAuth.token
});
// gulp build
runSequence(
'build',
'create components',
'update component repos'
);
});

92
tasks/admin/release.js

@ -1,86 +1,10 @@
/*******************************
Release Settings
*******************************/
/* Release */
gulp.task('release', false, function() {
// release settings
module.exports = {
// gulp build
runSequence(
'build',
'create files'
);
// path to components for repos
source : './dist/components/',
// modified asset paths for component repos
paths: {
source : '../themes/default/assets/',
output : 'assets/'
},
templates: {
bower : './tasks/admin/templates/bower.json',
composer : './tasks/admin/templates/composer.json',
package : './tasks/admin/templates/package.json',
meteor : './tasks/admin/templates/package.js',
meteorComponent : './tasks/admin/templates/package-component.js',
readme : './tasks/admin/templates/README.md',
notes : './RELEASE-NOTES.md'
},
org : 'Semantic-Org',
repo : 'Semantic-UI',
// root name for repos
repoRoot : 'UI-',
packageRoot : 'semantic-ui-',
// root path to repos
outputRoot : '../components/',
homepage : 'http://www.semantic-ui.com',
// components that get separate repositories for bower/npm
components : [
'accordion',
'api',
'breadcrumb',
'button',
'card',
'checkbox',
'comment',
'dimmer',
'divider',
'dropdown',
'feed',
'flag',
'form',
'grid',
'header',
'icon',
'image',
'input',
'item',
'label',
'list',
'loader',
'menu',
'message',
'modal',
'nag',
'popup',
'progress',
'rail',
'rating',
'reset',
'reveal',
'search',
'segment',
'shape',
'sidebar',
'site',
'statistic',
'step',
'sticky',
'tab',
'table',
'transition',
'video'
]
};
});

161
tasks/admin/update-repos.js

@ -0,0 +1,161 @@
gulp.task('update component repos', false, function() {
var
index = -1,
total = release.components.length,
stream,
stepRepo
;
console.log('Handling git');
// Do Git commands synchronously per component, to avoid issues
stepRepo = function() {
index = index + 1;
if(index >= total) {
return;
}
var
component = release.components[index],
outputDirectory = release.outputRoot + component + '/',
capitalizedComponent = component.charAt(0).toUpperCase() + component.slice(1),
repoName = release.repoRoot + capitalizedComponent,
gitURL = 'https://github.com/' + release.org + '/' + repoName + '.git',
repoURL = 'https://github.com/' + release.org + '/' + repoName + '/',
gitOptions = { cwd: outputDirectory },
quietOptions = { args: '-q', cwd: outputDirectory },
isRepository = fs.existsSync(outputDirectory + '.git/'),
componentPackage = fs.existsSync(outputDirectory + 'package.json' )
? require(outputDirectory + 'package.json')
: false,
commitArgs = (oAuth.name !== undefined && oAuth.email !== undefined)
? '--author "' + oAuth.name + ' <' + oAuth.email + '>"'
: '',
isNewVersion = (version && componentPackage.version != version),
mergeMessage = 'Merged from upstream',
commitMessage = (isNewVersion)
? 'Updated component to version ' + version
: 'Updated component release from Semantic-UI (Automatic)'
;
console.log('Processing repository:' + outputDirectory);
if(isRepository) {
commitFiles();
}
else {
createRepo();
}
// standard path
function commitFiles() {
// commit files
console.log('Committing files', commitArgs);
gulp.src('**/*', gitOptions)
.pipe(git.add(gitOptions))
.pipe(git.commit(commitMessage, { args: commitArgs, cwd: outputDirectory }))
.on('error', function(error) {
console.log('Nothing new to commit');
stepRepo();
})
.on('finish', function(callback) {
pullFiles();
})
;
}
function pullFiles() {
console.log('Pulling files');
git.pull('origin', 'master', { args: '', cwd: outputDirectory }, function(error) {
if(error && error.message.search("Couldn't find remote ref") != -1) {
createRepo();
}
else {
console.log('Pull completed successfully');
mergeCommit();
}
});
}
function mergeCommit() {
// commit files
console.log('Adding merge commit', commitArgs);
gulp.src('', gitOptions)
.pipe(git.add(gitOptions))
.pipe(git.commit(mergeMessage, { args: commitArgs, cwd: outputDirectory }))
.on('error', function(error) {
console.log('Nothing new to merge', error);
})
.on('finish', function(callback) {
if(1) {
tagFiles();
}
else {
pushFiles();
}
})
;
}
function tagFiles() {
console.log('Tagging new version ', version);
git.tag(version, 'Updated version from semantic-ui (automatic)', function (err) {
pushFiles();
});
}
function pushFiles() {
console.log('Pushing files');
git.push('origin', 'master', { args: '', cwd: outputDirectory }, function(error) {
if(error && error.message.search("Couldn't find remote ref") == -1) {
createRepo();
}
console.log('Push completed successfully');
stepRepo();
});
}
// set-up path
function createRepo() {
console.log('Creating repository ' + repoURL);
github.repos.createFromOrg({
org : release.org,
name : repoName,
homepage : release.homepage
}, function() {
if(isRepository) {
addRemote();
}
else {
initRepo();
}
});
}
function initRepo() {
console.log('Initializing repository in ' + outputDirectory);
git.init(gitOptions, function(error) {
if(error) {
console.error('Error initializing repo');
return;
}
addRemote();
});
}
function addRemote() {
console.log('Adding remote origin as ' + gitURL);
git.addRemote('origin', gitURL, gitOptions, firstPushFiles);
}
function firstPushFiles() {
console.log('Pushing files');
git.push('origin', 'master', { args: '-u', cwd: outputDirectory }, function(error) {
if(error) {
console.log(error);
pullFiles();
}
else {
console.log('First push completed successfully');
stepRepo();
}
});
}
};
return stepRepo();
});

130
tasks/build-rtl.js

@ -0,0 +1,130 @@
/*******************************
Build Task
*******************************/
var
gulp = require('gulp-help')(require('gulp')),
// node dependencies
fs = require('fs'),
// gulp dependencies
autoprefixer = require('gulp-autoprefixer'),
chmod = require('gulp-chmod'),
clone = require('gulp-clone'),
flatten = require('gulp-flatten'),
gulpif = require('gulp-if'),
header = require('gulp-header'),
less = require('gulp-less'),
minifyCSS = require('gulp-minify-css'),
plumber = require('gulp-plumber'),
print = require('gulp-print'),
rename = require('gulp-rename'),
replace = require('gulp-replace'),
rtlcss = require('gulp-rtlcss'),
uglify = require('gulp-uglify'),
// user config
config = require('./config/user'),
// install config
tasks = require('./config/project/tasks'),
install = require('./config/project/install'),
// shorthand
globs = config.globs,
assets = config.paths.assets,
output = config.paths.output,
source = config.paths.source,
banner = tasks.banner,
comments = tasks.regExp.comments,
log = tasks.log,
settings = tasks.settings
;
module.exports = function(callback) {
var
stream,
compressedStream,
uncompressedStream
;
console.info('Building Semantic');
if( !install.isSetup() ) {
console.error('Cannot build files. Run "gulp install" to set-up Semantic');
return;
}
// unified css stream
stream = gulp.src(source.definitions + '**/' + globs.components + '.less')
.pipe(plumber())
.pipe(less(settings.less))
.pipe(autoprefixer(settings.prefix))
.pipe(flatten())
;
// two concurrent streams from same source to concat release
uncompressedStream = stream.pipe(clone());
compressedStream = stream.pipe(clone());
uncompressedStream
.pipe(plumber())
.pipe(replace(comments.variables.in, comments.variables.out))
.pipe(replace(comments.large.in, comments.large.out))
.pipe(replace(comments.small.in, comments.small.out))
.pipe(replace(comments.tiny.in, comments.tiny.out))
.pipe(replace(assets.source, assets.uncompressed))
.pipe(header(banner, settings.header))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.uncompressed))
.pipe(print(log.created))
.on('end', function() {
gulp.start('package uncompressed rtl css');
})
;
compressedStream = stream
.pipe(plumber())
.pipe(clone())
.pipe(replace(assets.source, assets.compressed))
.pipe(minifyCSS(settings.minify))
.pipe(rename(settings.rename.minCSS))
.pipe(header(banner, settings.header))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.compressed))
.pipe(print(log.created))
.on('end', function() {
callback();
gulp.start('package compressed rtl css');
})
;
// copy assets
gulp.src(source.themes + '**/assets/**/' + globs.components + '?(s).*')
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.themes))
;
// copy source javascript
gulp.src(source.definitions + '**/' + globs.components + '.js')
.pipe(plumber())
.pipe(flatten())
.pipe(gulp.dest(output.uncompressed))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(print(log.created))
.pipe(uglify(settings.uglify))
.pipe(rename(settings.rename.minJS))
.pipe(header(banner, settings.header))
.pipe(gulp.dest(output.compressed))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(print(log.created))
.on('end', function() {
gulp.start('package compressed js');
gulp.start('package uncompressed js');
})
;
};

1
tasks/build.js

@ -42,7 +42,6 @@ var
settings = tasks.settings
;
// exports gulp task
module.exports = function(callback) {
var

11
tasks/check-install.js

@ -0,0 +1,11 @@
gulp.task('check install', false, function () {
setTimeout(function() {
if( runSetup || !fs.existsSync(config.files.site)) {
console.log('No semantic.json file found. Starting install...');
gulp.start('install');
}
else {
gulp.start('watch');
}
}, 50);
});

25
tasks/config/project/docs.js

@ -0,0 +1,25 @@
/*******************************
Docs
*******************************/
/* Custom paths config for serving docs */
module.exports = {
base: '',
paths: {
source: {
config : 'src/theme.config',
definitions : 'src/definitions/',
site : 'src/site/',
themes : 'src/themes/'
},
output: {
less : '../docs/out/src/',
packaged : '../docs/out/dist/',
uncompressed : '../docs/out/dist/components/',
compressed : '../docs/out/dist/components/',
themes : '../docs/out/dist/themes/'
},
clean: '../docs/out/dist/'
}
};

4
tasks/config/project/release.js

@ -50,9 +50,7 @@ module.exports = {
composer : 'composer.json',
config : 'semantic.json',
npm : 'package.json',
meteor : 'package.js',
site : 'src/site',
theme : 'src/theme.config'
meteor : 'package.js'
},
version : package.version

150
tasks/install.js

@ -0,0 +1,150 @@
/*******************************
Install Tasks
*******************************/
var
// install dependencies
jeditor = require('gulp-json-editor'),
prompt = require('gulp-prompt'),
wrench = require('wrench'),
questions = require('./tasks/questions')
;
gulp.task('install', 'Set-up project for first time', function () {
console.clear();
gulp
.src('gulpfile.js')
.pipe(prompt.prompt(questions.setup, function(answers) {
var
siteVariable = /@siteFolder .*\'(.*)/mg,
siteDestination = answers.site || config.folders.site,
pathToSite = path.relative(path.resolve(config.folders.theme), path.resolve(siteDestination)).replace(/\\/g,'/'),
sitePathReplace = "@siteFolder : '" + pathToSite + "/';",
configExists = fs.existsSync(config.files.config),
themeConfigExists = fs.existsSync(config.files.theme),
siteExists = fs.existsSync(siteDestination),
jsonSource = (configExists)
? config.files.config
: config.templates.config,
json = {
paths: {
source: {},
output: {}
}
}
;
// exit if config exists and user specifies no overwrite
if(answers.overwrite !== undefined && answers.overwrite == 'no') {
return;
}
console.clear();
console.log('Installing');
console.log('------------------------------');
// create site files
if(siteExists) {
console.info('Site folder exists, merging files (no overwrite)', siteDestination);
}
else {
console.info('Creating site theme folder', siteDestination);
}
// copy recursively without overwrite
wrench.copyDirSyncRecursive(config.templates.site, siteDestination, settings.wrench.recursive);
// adjust less variable for site folder location
console.info('Adjusting @siteFolder', sitePathReplace);
if(themeConfigExists) {
gulp.src(config.files.site)
.pipe(plumber())
.pipe(replace(siteVariable, sitePathReplace))
.pipe(chmod(config.permission))
.pipe(gulp.dest(config.folders.theme))
;
}
else {
console.info('Creating src/theme.config (LESS config)');
gulp.src(config.templates.theme)
.pipe(plumber())
.pipe(rename({ extname : '' }))
.pipe(replace(siteVariable, sitePathReplace))
.pipe(chmod(config.permission))
.pipe(gulp.dest(config.folders.theme))
;
}
// determine semantic.json config
if(answers.components) {
json.components = answers.components;
}
if(answers.permission) {
json.permission = +answers.permission;
}
if(answers.dist) {
answers.dist = answers.dist;
json.paths.output = {
packaged : answers.dist + '/',
uncompressed : answers.dist + '/components/',
compressed : answers.dist + '/components/',
themes : answers.dist + '/themes/'
};
}
if(answers.rtl) {
json.rtl = (answers.rtl == 'yes')
? true
: false
;
}
if(answers.site) {
json.paths.source.site = answers.site + '/';
}
if(answers.packaged) {
json.paths.output.packaged = answers.packaged + '/';
}
if(answers.compressed) {
json.paths.output.compressed = answers.compressed + '/';
}
if(answers.uncompressed) {
json.paths.output.uncompressed = answers.uncompressed + '/';
}
// write semantic.json
if(configExists) {
console.info('Extending semantic.json (Gulp config)');
gulp.src(jsonSource)
.pipe(plumber())
.pipe(rename(settings.rename.json)) // preserve file extension
.pipe(jeditor(json))
.pipe(chmod(config.permission))
.pipe(gulp.dest('./'))
;
}
else {
console.info('Creating semantic.json (Gulp config)');
gulp.src(jsonSource)
.pipe(plumber())
.pipe(rename({ extname : '' })) // remove .template from ext
.pipe(jeditor(json))
.pipe(chmod(config.permission))
.pipe(gulp.dest('./'))
;
}
console.log('');
console.log('');
}))
.pipe(prompt.prompt(questions.cleanup, function(answers) {
if(answers.cleanup == 'yes') {
del(config.setupFiles);
}
if(answers.build == 'yes') {
config = require(config.files.config);
getConfigValues();
gulp.start('build');
}
}))
;
});

85
tasks/internal.js

@ -0,0 +1,85 @@
/*******************************
Internal Tasks
*******************************/
/* These tasks create packaged files from **dist** components
Not intended to be called directly by a user because
these do not build fresh from source
*/
/*--------------
Packaged
---------------*/
gulp.task('package uncompressed css', false, function() {
return gulp.src(output.uncompressed + '**/' + config.globs.components + config.globs.ignored + '.css')
.pipe(plumber())
.pipe(replace(assetPaths.uncompressed, assetPaths.packaged))
.pipe(concatCSS('semantic.css'))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.packaged))
.pipe(print(log.created))
;
});
gulp.task('package compressed css', false, function() {
return gulp.src(output.uncompressed + '**/' + config.globs.components + config.globs.ignored + '.css')
.pipe(plumber())
.pipe(replace(assetPaths.uncompressed, assetPaths.packaged))
.pipe(concatCSS('semantic.min.css'))
.pipe(minifyCSS(settings.minify))
.pipe(header(banner, settings.header))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.packaged))
.pipe(print(log.created))
;
});
gulp.task('package uncompressed js', false, function() {
return gulp.src(output.uncompressed + '**/' + config.globs.components + '!(*.min|*.map).js')
.pipe(plumber())
.pipe(replace(assetPaths.uncompressed, assetPaths.packaged))
.pipe(concat('semantic.js'))
.pipe(header(banner, settings.header))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.packaged))
.pipe(print(log.created))
;
});
gulp.task('package compressed js', false, function() {
return gulp.src(output.uncompressed + '**/' + config.globs.components + '!(*.min|*.map).js')
.pipe(plumber())
.pipe(replace(assetPaths.uncompressed, assetPaths.packaged))
.pipe(concat('semantic.min.js'))
.pipe(uglify(settings.uglify))
.pipe(header(banner, settings.header))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.packaged))
.pipe(print(log.created))
;
});
/*--------------
RTL
---------------*/
gulp.task('package uncompressed rtl css', false, function () {
return gulp.src(output.uncompressed + '**/' + config.globs.components + '!(*.min|*.map).rtl.css')
.pipe(replace(assetPaths.uncompressed, assetPaths.packaged))
.pipe(concatCSS('semantic.rtl.css'))
.pipe(gulp.dest(output.packaged))
.pipe(print(log.created))
;
});
gulp.task('package compressed rtl css', false, function () {
return gulp.src(output.uncompressed + '**/' + config.globs.components + '!(*.min|*.map).rtl.css')
.pipe(replace(assetPaths.uncompressed, assetPaths.packaged))
.pipe(concatCSS('semantic.rtl.min.css'))
.pipe(minifyCSS(settings.minify))
.pipe(header(banner, settings.header))
.pipe(gulp.dest(output.packaged))
.pipe(print(log.created))
;
});

21
tasks/serve-docs.js

@ -0,0 +1,21 @@
/* Moves watched files to static site generator output */
gulp.task('serve-docs', false, function () {
config = require('./tasks/admin/docs.json');
getConfigValues();
// copy source files
gulp
.watch([
'src/**/*.*'
], function(file) {
console.clear();
return gulp.src(file.path, { base: 'src/' })
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.less))
.pipe(print(log.created))
;
})
;
gulp.start('watch');
});

220
tasks/watch-rtl.js

@ -0,0 +1,220 @@
/*******************************
Watch Task
*******************************/
var
gulp = require('gulp-help')(require('gulp')),
// node deps
console = require('better-console'),
fs = require('fs'),
// gulp deps
autoprefixer = require('gulp-autoprefixer'),
chmod = require('gulp-chmod'),
clone = require('gulp-clone'),
gulpif = require('gulp-if'),
header = require('gulp-header'),
less = require('gulp-less'),
minifyCSS = require('gulp-minify-css'),
plumber = require('gulp-plumber'),
print = require('gulp-print'),
rename = require('gulp-rename'),
replace = require('gulp-replace'),
rtlcss = require('gulp-rtlcss'),
uglify = require('gulp-uglify'),
util = require('gulp-util'),
watch = require('gulp-watch'),
// user config
config = require('./config/user'),
// task config
tasks = require('./config/project/tasks'),
install = require('./config/project/install'),
// shorthand
globs = config.globs,
assets = config.paths.assets,
output = config.paths.output,
source = config.paths.source,
banner = tasks.banner,
comments = tasks.regExp.comments,
log = tasks.log,
settings = tasks.settings
;
module.exports = function(callback) {
if( !install.isSetup() ) {
console.error('Cannot watch files. Run "gulp install" to set-up Semantic');
return;
}
console.clear();
console.log('Watching source files for changes');
/*--------------
Watch CSS
---------------*/
gulp
.watch([
source.config,
source.definitions + '**/*.less',
source.site + '**/*.{overrides,variables}',
source.themes + '**/*.{overrides,variables}'
], function(file) {
var
lessPath,
stream,
compressedStream,
uncompressedStream,
isDefinition,
isPackagedTheme,
isSiteTheme,
isConfig
;
// log modified file
gulp.src(file.path)
.pipe(print(log.modified))
;
/*--------------
Find Source
---------------*/
// recompile on *.override , *.variable change
isConfig = (file.path.indexOf('.config') !== -1);
isPackagedTheme = (file.path.indexOf(source.themes) !== -1);
isSiteTheme = (file.path.indexOf(source.site) !== -1);
isDefinition = (file.path.indexOf(source.definitions) !== -1);
if(isConfig) {
console.log('Change detected in theme config');
// cant tell which theme was changed in theme.config, rebuild all
gulp.start('build');
}
else if(isPackagedTheme) {
console.log('Change detected in packaged theme');
lessPath = lessPath.replace(tasks.regExp.theme, source.definitions);
lessPath = util.replaceExtension(file.path, '.less');
}
else if(isSiteTheme) {
console.log('Change detected in site theme');
lessPath = lessPath.replace(source.site, source.definitions);
lessPath = util.replaceExtension(file.path, '.less');
}
else if(isDefinition) {
console.log('Change detected in definition');
lessPath = util.replaceExtension(file.path, '.less');
}
/*--------------
Create CSS
---------------*/
if( fs.existsSync(lessPath) ) {
// unified css stream
stream = gulp.src(lessPath)
.pipe(plumber())
.pipe(less(settings.less))
.pipe(replace(comments.variables.in, comments.variables.out))
.pipe(replace(comments.large.in, comments.large.out))
.pipe(replace(comments.small.in, comments.small.out))
.pipe(replace(comments.tiny.in, comments.tiny.out))
.pipe(autoprefixer(settings.prefix))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(rtlcss())
;
// use 2 concurrent streams from same pipe
uncompressedStream = stream.pipe(clone());
compressedStream = stream.pipe(clone());
uncompressedStream
.pipe(plumber())
.pipe(replace(assets.source, assets.uncompressed))
.pipe(header(banner, settings.header))
.pipe(rename(settings.rename.rtlCSS))
.pipe(gulp.dest(output.uncompressed))
.pipe(print(log.created))
.on('end', function() {
gulp.start('package uncompressed rtl css');
})
;
compressedStream = stream
.pipe(plumber())
.pipe(replace(assets.source, assets.compressed))
.pipe(minifyCSS(settings.minify))
.pipe(rename(settings.rename.minCSS))
.pipe(header(banner, settings.header))
.pipe(rename(settings.rename.rtlMinCSS))
.pipe(gulp.dest(output.compressed))
.pipe(print(log.created))
.on('end', function() {
gulp.start('package compressed rtl css');
})
;
}
else {
console.log('Cannot find UI definition at path', lessPath);
}
})
;
/*--------------
Watch JS
---------------*/
gulp
.watch([
source.definitions + '**/*.js'
], function(file) {
gulp.src(file.path)
.pipe(plumber())
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.uncompressed))
.pipe(print(log.created))
.pipe(uglify(settings.uglify))
.pipe(rename(settings.rename.minJS))
.pipe(gulp.dest(output.compressed))
.pipe(print(log.created))
.on('end', function() {
gulp.start('package compressed js');
gulp.start('package uncompressed js');
})
;
})
;
/*--------------
Watch Assets
---------------*/
// only copy assets that match component names (or their plural)
gulp
.watch([
source.themes + '**/assets/**/' + globs.components + '?(s).*'
], function(file) {
// copy assets
gulp.src(file.path, { base: source.themes })
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.themes))
.pipe(print(log.created))
;
})
;
};

66
tasks/watch.js

@ -13,6 +13,7 @@ var
autoprefixer = require('gulp-autoprefixer'),
chmod = require('gulp-chmod'),
clone = require('gulp-clone'),
gulpif = require('gulp-if'),
header = require('gulp-header'),
less = require('gulp-less'),
minifyCSS = require('gulp-minify-css'),
@ -47,23 +48,18 @@ var
module.exports = function(callback) {
if( !install.isSetup() ) {
console.error('Cannot watch files. Run "gulp install" to set-up Semantic');
return;
}
// start rtl task instead
if(config.rtl) {
gulp.start('watch rtl');
return;
}
console.clear();
console.log('Watching source files for changes');
/*--------------
Watch CSS
---------------*/
// watching changes in style
gulp
.watch([
source.config,
@ -71,11 +67,14 @@ module.exports = function(callback) {
source.site + '**/*.{overrides,variables}',
source.themes + '**/*.{overrides,variables}'
], function(file) {
var
lessPath,
stream,
compressedStream,
uncompressedStream,
isDefinition,
isPackagedTheme,
isSiteTheme,
@ -87,12 +86,17 @@ module.exports = function(callback) {
.pipe(print(log.modified))
;
/*--------------
Find Source
---------------*/
// recompile on *.override , *.variable change
isConfig = (file.path.indexOf('.config') !== -1);
isPackagedTheme = (file.path.indexOf(source.themes) !== -1);
isSiteTheme = (file.path.indexOf(source.site) !== -1);
isDefinition = (file.path.indexOf(source.definitions) !== -1);
if(isConfig) {
console.log('Change detected in theme config');
// impossible to tell which file was updated in theme.config, rebuild all
@ -113,6 +117,10 @@ module.exports = function(callback) {
lessPath = util.replaceExtension(file.path, '.less');
}
/*--------------
Create CSS
---------------*/
if( fs.existsSync(lessPath) ) {
// unified css stream
@ -124,6 +132,7 @@ module.exports = function(callback) {
.pipe(replace(comments.small.in, comments.small.out))
.pipe(replace(comments.tiny.in, comments.tiny.out))
.pipe(autoprefixer(settings.prefix))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
;
// use 2 concurrent streams from same pipe
@ -134,7 +143,6 @@ module.exports = function(callback) {
.pipe(plumber())
.pipe(replace(assets.source, assets.uncompressed))
.pipe(header(banner, settings.header))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.uncompressed))
.pipe(print(log.created))
.on('end', function() {
@ -144,12 +152,10 @@ module.exports = function(callback) {
compressedStream = stream
.pipe(plumber())
.pipe(clone())
.pipe(replace(assets.source, assets.compressed))
.pipe(minifyCSS(settings.minify))
.pipe(rename(settings.rename.minCSS))
.pipe(header(banner, settings.header))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.compressed))
.pipe(print(log.created))
.on('end', function() {
@ -164,33 +170,21 @@ module.exports = function(callback) {
})
;
// watch for changes in assets that match component names (or their plural)
gulp
.watch([
source.themes + '**/assets/**/' + globs.components + '?(s).*'
], function(file) {
// copy assets
gulp.src(file.path, { base: source.themes })
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.themes))
.pipe(print(log.created))
;
})
;
/*--------------
Watch JS
---------------*/
// watch for changes in js
gulp
.watch([
source.definitions + '**/*.js'
], function(file) {
gulp.src(file.path)
.pipe(plumber())
.pipe(chmod(config.permission))
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.uncompressed))
.pipe(print(log.created))
.pipe(uglify(settings.uglify))
.pipe(rename(settings.rename.minJS))
.pipe(chmod(config.permission))
.pipe(gulp.dest(output.compressed))
.pipe(print(log.created))
.on('end', function() {
@ -201,4 +195,22 @@ module.exports = function(callback) {
})
;
/*--------------
Watch Assets
---------------*/
// only copy assets that match component names (or their plural)
gulp
.watch([
source.themes + '**/assets/**/' + globs.components + '?(s).*'
], function(file) {
// copy assets
gulp.src(file.path, { base: source.themes })
.pipe(gulpif(config.hasPermission, chmod(config.permission)))
.pipe(gulp.dest(output.themes))
.pipe(print(log.created))
;
})
;
};

1094
temp.js
File diff suppressed because it is too large
View File

Loading…
Cancel
Save