28 changed files with 1344 additions and 1302 deletions
Unified View
Diff Options
-
2dist/components/accordion.min.js
-
2dist/components/form.min.js
-
2dist/components/reset.css
-
2dist/components/reset.min.css
-
2dist/components/site.css
-
2dist/components/site.min.css
-
2dist/components/site.min.js
-
29gulpfile.js
-
5tasks/admin/config/oauth.example.js
-
86tasks/admin/config/release.js
-
311tasks/admin/create-repos.js
-
19tasks/admin/docs.json
-
50tasks/admin/questions.js
-
44tasks/admin/register-repos.js
-
28tasks/admin/release-all.js
-
92tasks/admin/release.js
-
161tasks/admin/update-repos.js
-
130tasks/build-rtl.js
-
1tasks/build.js
-
11tasks/check-install.js
-
25tasks/config/project/docs.js
-
4tasks/config/project/release.js
-
150tasks/install.js
-
85tasks/internal.js
-
21tasks/serve-docs.js
-
220tasks/watch-rtl.js
-
66tasks/watch.js
-
1094temp.js
@ -1,3 +1,8 @@ |
|||||
|
/* |
||||
|
Used to import GitHub Auth Token |
||||
|
To Automate GitHub Updates |
||||
|
*/ |
||||
|
|
||||
module.exports = { |
module.exports = { |
||||
token : 'AN-OAUTH2-TOKEN', |
token : 'AN-OAUTH2-TOKEN', |
||||
name : 'Your Name', |
name : 'Your Name', |
@ -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' |
||||
|
] |
||||
|
}; |
@ -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); |
||||
|
}); |
@ -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/" |
|
||||
} |
|
||||
} |
|
@ -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 |
|
||||
} |
|
||||
] |
|
||||
|
|
||||
}; |
|
@ -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(); |
||||
|
}); |
||||
|
|
@ -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' |
||||
|
); |
||||
|
|
||||
|
}); |
@ -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' |
|
||||
] |
|
||||
}; |
|
||||
|
}); |
@ -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(); |
||||
|
|
||||
|
}); |
@ -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'); |
||||
|
}) |
||||
|
; |
||||
|
|
||||
|
}; |
@ -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); |
||||
|
}); |
@ -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/' |
||||
|
} |
||||
|
}; |
@ -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'); |
||||
|
} |
||||
|
})) |
||||
|
; |
||||
|
}); |
@ -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)) |
||||
|
; |
||||
|
}); |
@ -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'); |
||||
|
}); |
@ -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)) |
||||
|
; |
||||
|
}) |
||||
|
; |
||||
|
|
||||
|
}; |
1094
temp.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save