summaryrefslogtreecommitdiffstats
path: root/src/wwwroot/libraries/fomantic/tasks/config/project
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/config/project
downloadfagprove-master.tar.xz
fagprove-master.zip
InitialHEADmaster
Diffstat (limited to 'src/wwwroot/libraries/fomantic/tasks/config/project')
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/config/project/config.js143
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/config/project/install.js763
-rw-r--r--src/wwwroot/libraries/fomantic/tasks/config/project/release.js65
3 files changed, 971 insertions, 0 deletions
diff --git a/src/wwwroot/libraries/fomantic/tasks/config/project/config.js b/src/wwwroot/libraries/fomantic/tasks/config/project/config.js
new file mode 100644
index 0000000..49e1f18
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/config/project/config.js
@@ -0,0 +1,143 @@
+/*******************************
+ Set-up
+*******************************/
+
+var
+ extend = require('extend'),
+ fs = require('fs'),
+ path = require('path'),
+
+ defaults = require('../defaults')
+;
+
+
+/*******************************
+ Exports
+*******************************/
+
+module.exports = {
+
+ getPath: function(file, directory) {
+ var
+ configPath,
+ walk = function(directory) {
+ var
+ nextDirectory = path.resolve( path.join(directory, path.sep, '..') ),
+ currentPath = path.normalize( path.join(directory, file) )
+ ;
+ if( fs.existsSync(currentPath) ) {
+ // found file
+ configPath = path.normalize(directory);
+ return;
+ }
+ else {
+ // reached file system root, let's stop
+ if(nextDirectory == directory) {
+ return;
+ }
+ // otherwise recurse
+ walk(nextDirectory, file);
+ }
+ }
+ ;
+
+ // start walk from outside require-dot-files directory
+ file = file || defaults.files.config;
+ directory = directory || path.join(__dirname, path.sep, '..');
+ walk(directory);
+ return configPath || '';
+ },
+
+ // adds additional derived values to a config object
+ addDerivedValues: function(config) {
+
+ config = config || extend(false, {}, defaults);
+
+ /*--------------
+ File Paths
+ ---------------*/
+
+ var
+ configPath = this.getPath(),
+ sourcePaths = {},
+ outputPaths = {},
+ folder
+ ;
+
+ // resolve paths (config location + base + path)
+ for(folder in config.paths.source) {
+ if(config.paths.source.hasOwnProperty(folder)) {
+ sourcePaths[folder] = path.resolve(path.join(configPath, config.base, config.paths.source[folder]));
+ }
+ }
+ for(folder in config.paths.output) {
+ if(config.paths.output.hasOwnProperty(folder)) {
+ outputPaths[folder] = path.resolve(path.join(configPath, config.base, config.paths.output[folder]));
+ }
+ }
+
+ // set config paths to full paths
+ config.paths.source = sourcePaths;
+ config.paths.output = outputPaths;
+
+ // resolve "clean" command path
+ config.paths.clean = path.resolve( path.join(configPath, config.base, config.paths.clean) );
+
+ /*--------------
+ CSS URLs
+ ---------------*/
+
+ // determine asset paths in css by finding relative path between themes and output
+ // force forward slashes
+
+ config.paths.assets = {
+ source : '../../themes', // source asset path is always the same
+ uncompressed : './' + path.relative(config.paths.output.uncompressed, config.paths.output.themes).replace(/\\/g, '/'),
+ compressed : './' + path.relative(config.paths.output.compressed, config.paths.output.themes).replace(/\\/g, '/'),
+ packaged : './' + path.relative(config.paths.output.packaged, config.paths.output.themes).replace(/\\/g, '/')
+ };
+
+ /*--------------
+ Permission
+ ---------------*/
+
+ if(config.permission) {
+ config.hasPermissions = true;
+ config.parsedPermissions = typeof config.permission === 'string' ? parseInt(config.permission, 8) : config.permission;
+ }
+ else {
+ // pass blank object to avoid causing errors
+ config.permission = {};
+ config.hasPermissions = false;
+ config.parsedPermissions = {};
+ }
+
+ /*--------------
+ Globs
+ ---------------*/
+
+ if(!config.globs) {
+ config.globs = {};
+ }
+
+ // remove duplicates from component array
+ if(config.components instanceof Array) {
+ config.components = config.components.filter(function(component, index) {
+ return config.components.indexOf(component) == index;
+ });
+ }
+
+ // takes component object and creates file glob matching selected components
+ config.globs.components = (typeof config.components == 'object')
+ ? (config.components.length > 1)
+ ? '{' + config.components.join(',') + '}'
+ : config.components[0]
+ : '{' + defaults.components.join(',') + '}'
+ ;
+
+ return config;
+
+ }
+
+};
+
diff --git a/src/wwwroot/libraries/fomantic/tasks/config/project/install.js b/src/wwwroot/libraries/fomantic/tasks/config/project/install.js
new file mode 100644
index 0000000..f535993
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/config/project/install.js
@@ -0,0 +1,763 @@
+/*******************************
+ Set-up
+*******************************/
+
+var
+ fs = require('fs'),
+ path = require('path'),
+ defaults = require('../defaults'),
+ release = require('./release'),
+
+ requireDotFile = require('require-dot-file')
+;
+
+/*******************************
+ When to Ask
+*******************************/
+
+/* Preconditions for install questions */
+
+var when = {
+
+ // path
+ changeRoot: function(questions) {
+ return (questions.useRoot !== undefined && questions.useRoot !== true);
+ },
+
+ // permissions
+ changePermissions: function(questions) {
+ return (questions.changePermissions && questions.changePermissions === true);
+ },
+
+ // install
+ hasConfig: function() {
+ return requireDotFile('semantic.json', process.cwd());
+ },
+
+ allowOverwrite: function(questions) {
+ return (questions.overwrite === undefined || questions.overwrite == 'yes');
+ },
+ notAuto: function(questions) {
+ return (questions.install !== 'auto' && (questions.overwrite === undefined || questions.overwrite == 'yes'));
+ },
+ custom: function(questions) {
+ return (questions.install === 'custom' && (questions.overwrite === undefined || questions.overwrite == 'yes'));
+ },
+ express: function(questions) {
+ return (questions.install === 'express' && (questions.overwrite === undefined || questions.overwrite == 'yes'));
+ },
+
+ // customize
+ customize: function(questions) {
+ return (questions.customize === true);
+ },
+ primaryColor: function(questions) {
+ return (questions.primaryColor);
+ },
+ secondaryColor: function(questions) {
+ return (questions.secondaryColor);
+ }
+};
+
+/*******************************
+ Response Filters
+*******************************/
+
+/* Filters to user input from install questions */
+
+var filter = {
+ removeTrailingSlash: function(path) {
+ return path.replace(/(\/$|\\$)+/mg, '');
+ }
+};
+
+/*******************************
+ Configuration
+*******************************/
+
+module.exports = {
+
+ // check whether install is setup
+ isSetup: function() {
+ return when.hasConfig();
+ },
+
+ // detect whether there is a semantic.json configuration and that the auto-install option is set to true
+ shouldAutoInstall: function() {
+ var
+ config = when.hasConfig()
+ ;
+ return config['autoInstall'];
+ },
+
+ // checks if files are in a PM directory
+ getPackageManager: function(directory) {
+ var
+ // returns last matching result (avoid sub-module detection)
+ walk = function(directory) {
+ var
+ pathArray = directory.split(path.sep),
+ folder = pathArray[pathArray.length - 1],
+ nextDirectory = path.join(directory, path.sep, '..')
+ ;
+ if( folder == 'bower_components') {
+ return {
+ name: 'Bower',
+ root: nextDirectory
+ };
+ }
+ else if(folder == 'node_modules') {
+ return {
+ name: 'NPM',
+ root: nextDirectory
+ };
+ }
+ else if(folder == 'composer') {
+ return {
+ name: 'Composer',
+ root: nextDirectory
+ };
+ }
+ if(path.resolve(directory) == path.resolve(nextDirectory)) {
+ return false;
+ }
+ // recurse downward
+ return walk(nextDirectory);
+ }
+ ;
+ // start walk from current directory if none specified
+ directory = directory || (__dirname + path.sep);
+ return walk(directory);
+ },
+
+ // checks if files is PMed submodule
+ isSubModule: function(directory) {
+ var
+ moduleFolders = 0,
+ walk = function(directory) {
+ var
+ pathArray = directory.split(path.sep),
+ folder = pathArray[pathArray.length - 2],
+ nextDirectory = path.join(directory, path.sep, '..')
+ ;
+ if( folder == 'bower_components') {
+ moduleFolders++;
+ }
+ else if(folder == 'node_modules') {
+ moduleFolders++;
+ }
+ else if(folder == 'composer') {
+ moduleFolders++;
+ }
+ if(path.resolve(directory) == path.resolve(nextDirectory)) {
+ return (moduleFolders > 1);
+ }
+ // recurse downward
+ return walk(nextDirectory);
+ }
+ ;
+ // start walk from current directory if none specified
+ directory = directory || (__dirname + path.sep);
+ return walk(directory);
+ },
+
+
+ createJSON: function(answers) {
+ var
+ json = {
+ paths: {
+ source: {},
+ output: {}
+ }
+ }
+ ;
+
+ // add components
+ if(answers.components) {
+ json.components = answers.components;
+ }
+
+ // add rtl choice
+ if(answers.rtl) {
+ json.rtl = answers.rtl;
+ }
+
+ // add permissions
+ if(answers.permission) {
+ json.permission = answers.permission;
+ }
+
+ // add path to semantic
+ if(answers.semanticRoot) {
+ json.base = path.normalize(answers.semanticRoot);
+ }
+
+ // record version number to avoid re-installing on same version
+ json.version = release.version;
+
+ // add dist folder paths
+ if(answers.dist) {
+ answers.dist = path.normalize(answers.dist);
+
+ json.paths.output = {
+ packaged : path.normalize(answers.dist + '/'),
+ uncompressed : path.normalize(answers.dist + '/components/'),
+ compressed : path.normalize(answers.dist + '/components/'),
+ themes : path.normalize(answers.dist + '/themes/')
+ };
+ }
+
+ // add site path
+ if(answers.site) {
+ json.paths.source.site = path.normalize(answers.site + '/');
+ }
+ if(answers.packaged) {
+ json.paths.output.packaged = path.normalize(answers.packaged + '/');
+ }
+ if(answers.compressed) {
+ json.paths.output.compressed = path.normalize(answers.compressed + '/');
+ }
+ if(answers.uncompressed) {
+ json.paths.output.uncompressed = path.normalize(answers.uncompressed + '/');
+ }
+ return json;
+ },
+
+ // files cleaned up after install
+ setupFiles: [
+ './src/theme.config.example',
+ './semantic.json.example',
+ './src/_site'
+ ],
+
+ regExp: {
+ // used to match siteFolder variable in theme.less
+ siteVariable: /@siteFolder .*\'(.*)/mg
+ },
+
+ // source paths (when installing)
+ source: {
+ config : './semantic.json.example',
+ definitions : './src/definitions',
+ gulpFile : './gulpfile.js',
+ lessImport : './src/semantic.less',
+ site : './src/_site',
+ tasks : './tasks',
+ themeConfig : './src/theme.config.example',
+ themeImport : './src/theme.less',
+ themes : './src/themes',
+ defaultTheme : './src/themes/default',
+ userGulpFile : './tasks/config/npm/gulpfile.js'
+ },
+
+ // expected final filenames
+ files: {
+ config : 'semantic.json',
+ lessImport : 'src/semantic.less',
+ site : 'src/site',
+ themeConfig : 'src/theme.config',
+ themeImport : 'src/theme.less'
+ },
+
+ // folder paths to files relative to root
+ folders: {
+ config : './',
+ definitions : 'src/definitions/',
+ lessImport : 'src/',
+ modules : 'node_modules/',
+ site : 'src/site/',
+ tasks : 'tasks/',
+ themeConfig : 'src/',
+ themeImport : 'src/',
+ themes : 'src/themes/',
+
+ defaultTheme : 'default/' // only path that is relative to another directory and not root
+ },
+
+ // questions asked during install
+ questions: {
+
+ root: [
+ {
+ type : 'list',
+ name : 'useRoot',
+ message :
+ '{packageMessage} Is this your project folder? {root}',
+ choices: [
+ {
+ name : 'Yes',
+ value : true
+ },
+ {
+ name : 'No, let me specify',
+ value : false
+ }
+ ]
+ },
+ {
+ type : 'input',
+ name : 'customRoot',
+ message : 'Please enter the absolute path to your project root',
+ default : '/my/project/path',
+ when : when.changeRoot
+ },
+ {
+ type : 'input',
+ name : 'semanticRoot',
+ message : 'Where should we put Semantic UI inside your project?',
+ default : 'semantic/'
+ }
+ ],
+
+ setup: [
+ {
+ type: 'list',
+ name: 'overwrite',
+ message: 'It looks like you have a semantic.json file already.',
+ when: when.hasConfig,
+ choices: [
+ {
+ name: 'Yes, extend my current settings.',
+ value: 'yes'
+ },
+ {
+ name: 'Skip install',
+ value: 'no'
+ }
+ ]
+ },
+ {
+ type: 'list',
+ name: 'install',
+ message: 'Set-up Semantic UI',
+ when: when.allowOverwrite,
+ choices: [
+ {
+ name: 'Automatic (Use default locations and all components)',
+ value: 'auto'
+ },
+ {
+ name: 'Express (Set components and output folder)',
+ value: 'express'
+ },
+ {
+ name: 'Custom (Customize all src/dist values)',
+ value: 'custom'
+ }
+ ]
+ },
+ {
+ type: 'checkbox',
+ name: 'components',
+ message: 'What components should we include in the package?',
+
+ // duplicated manually from tasks/defaults.js with additional property
+ choices: [
+ { name: "reset", checked: true },
+ { name: "site", checked: true },
+ { name: "button", checked: true },
+ { name: "container", checked: true },
+ { name: "divider", checked: true },
+ { name: "emoji", checked: true },
+ { name: "flag", checked: true },
+ { name: "header", checked: true },
+ { name: "icon", checked: true },
+ { name: "image", checked: true },
+ { name: "input", checked: true },
+ { name: "label", checked: true },
+ { name: "list", checked: true },
+ { name: "loader", checked: true },
+ { name: "rail", checked: true },
+ { name: "reveal", checked: true },
+ { name: "segment", checked: true },
+ { name: "step", checked: true },
+ { name: "breadcrumb", checked: true },
+ { name: "form", checked: true },
+ { name: "grid", checked: true },
+ { name: "menu", checked: true },
+ { name: "message", checked: true },
+ { name: "table", checked: true },
+ { name: "ad", checked: true },
+ { name: "card", checked: true },
+ { name: "comment", checked: true },
+ { name: "feed", checked: true },
+ { name: "item", checked: true },
+ { name: "statistic", checked: true },
+ { name: "accordion", checked: true },
+ { name: "calendar", checked: true },
+ { name: "checkbox", checked: true },
+ { name: "dimmer", checked: true },
+ { name: "dropdown", checked: true },
+ { name: "embed", checked: true },
+ { name: "modal", checked: true },
+ { name: "nag", checked: true },
+ { name: "placeholder", checked: true },
+ { name: "popup", checked: true },
+ { name: "progress", checked: true },
+ { name: "slider", checked: true },
+ { name: "rating", checked: true },
+ { name: "search", checked: true },
+ { name: "shape", checked: true },
+ { name: "sidebar", checked: true },
+ { name: "sticky", checked: true },
+ { name: "tab", checked: true },
+ { name: "text", checked: true },
+ { name: "toast", checked: true },
+ { name: "transition", checked: true },
+ { name: "api", checked: true },
+ { name: "form", checked: true },
+ { name: "state", checked: true },
+ { name: "visibility", checked: true }
+ ],
+ when: when.notAuto
+ },
+ {
+ type: 'list',
+ name: 'changePermissions',
+ when: when.notAuto,
+ message: 'Should we set permissions on outputted files?',
+ choices: [
+ {
+ name: 'No',
+ value: false
+ },
+ {
+ name: 'Yes',
+ value: true
+ }
+ ]
+ },
+ {
+ type: 'input',
+ name: 'permission',
+ message: 'What octal file permission should outputted files receive?',
+ default: defaults.permission,
+ when: when.changePermissions
+ },
+ {
+ type: 'list',
+ name: 'rtl',
+ message: 'Do you use a RTL (Right-To-Left) language?',
+ when: when.notAuto,
+ choices: [
+ {
+ name: 'No',
+ value: false
+ },
+ {
+ name: 'Yes',
+ value: true
+ },
+ {
+ name: 'Build Both',
+ value: 'both'
+ }
+ ]
+ },
+ {
+ type: 'input',
+ name: 'dist',
+ message: 'Where should we output Semantic UI?',
+ default: defaults.paths.output.packaged,
+ filter: filter.removeTrailingSlash,
+ when: when.express
+ },
+ {
+ type: 'input',
+ name: 'site',
+ message: 'Where should we put your site folder?',
+ default: defaults.paths.source.site,
+ filter: filter.removeTrailingSlash,
+ when: when.custom
+ },
+ {
+ type: 'input',
+ name: 'packaged',
+ message: 'Where should we output a packaged version?',
+ default: defaults.paths.output.packaged,
+ filter: filter.removeTrailingSlash,
+ when: when.custom
+ },
+ {
+ type: 'input',
+ name: 'compressed',
+ message: 'Where should we output compressed components?',
+ default: defaults.paths.output.compressed,
+ filter: filter.removeTrailingSlash,
+ when: when.custom
+ },
+ {
+ type: 'input',
+ name: 'uncompressed',
+ message: 'Where should we output uncompressed components?',
+ default: defaults.paths.output.uncompressed,
+ filter: filter.removeTrailingSlash,
+ when: when.custom
+ }
+ ],
+
+
+ cleanup: [
+ {
+ type: 'list',
+ name: 'cleanup',
+ message: 'Should we remove set-up files?',
+ choices: [
+ {
+ name: 'Yes (re-install will require redownloading semantic).',
+ value: 'yes'
+ },
+ {
+ name: 'No Thanks',
+ value: 'no'
+ }
+ ]
+ },
+ {
+ type: 'list',
+ name: 'build',
+ message: 'Do you want to build Semantic now?',
+ choices: [
+ {
+ name: 'Yes',
+ value: 'yes'
+ },
+ {
+ name: 'No',
+ value: 'no'
+ }
+ ]
+ },
+ ],
+ site: [
+ {
+ type: 'list',
+ name: 'customize',
+ message: 'You have not yet customized your site, can we help you do that?',
+ choices: [
+ {
+ name: 'Yes, ask me a few questions',
+ value: true
+ },
+ {
+ name: 'No I\'ll do it myself',
+ value: false
+ }
+ ]
+ },
+ {
+ type: 'list',
+ name: 'headerFont',
+ message: 'Select your header font',
+ choices: [
+ {
+ name: 'Helvetica Neue, Arial, sans-serif',
+ value: 'Helvetica Neue, Arial, sans-serif;'
+ },
+ {
+ name: 'Lato (Google Fonts)',
+ value: 'Lato'
+ },
+ {
+ name: 'Open Sans (Google Fonts)',
+ value: 'Open Sans'
+ },
+ {
+ name: 'Source Sans Pro (Google Fonts)',
+ value: 'Source Sans Pro'
+ },
+ {
+ name: 'Droid (Google Fonts)',
+ value: 'Droid'
+ },
+ {
+ name: 'I\'ll choose on my own',
+ value: false
+ }
+ ],
+ when: when.customize
+ },
+ {
+ type: 'list',
+ name: 'pageFont',
+ message: 'Select your page font',
+ choices: [
+ {
+ name: 'Helvetica Neue, Arial, sans-serif',
+ value: 'Helvetica Neue, Arial, sans-serif;'
+ },
+ {
+ name: 'Lato (Import from Google Fonts)',
+ value: 'Lato'
+ },
+ {
+ name: 'Open Sans (Import from Google Fonts)',
+ value: 'Open Sans'
+ },
+ {
+ name: 'Source Sans Pro (Import from Google Fonts)',
+ value: 'Source Sans Pro'
+ },
+ {
+ name: 'Droid (Google Fonts)',
+ value: 'Droid'
+ },
+ {
+ name: 'I\'ll choose on my own',
+ value: false
+ }
+ ],
+ when: when.customize
+ },
+ {
+ type: 'list',
+ name: 'fontSize',
+ message: 'Select your base font size',
+ default: '14px',
+ choices: [
+ {
+ name: '12px',
+ },
+ {
+ name: '13px',
+ },
+ {
+ name: '14px (Recommended)',
+ value: '14px'
+ },
+ {
+ name: '15px',
+ },
+ {
+ name: '16px',
+ },
+ {
+ name: 'I\'ll choose on my own',
+ value: false
+ }
+ ],
+ when: when.customize
+ },
+ {
+ type: 'list',
+ name: 'primaryColor',
+ message: 'Select the closest name for your primary brand color',
+ default: '14px',
+ choices: [
+ {
+ name: 'Blue'
+ },
+ {
+ name: 'Green'
+ },
+ {
+ name: 'Orange'
+ },
+ {
+ name: 'Pink'
+ },
+ {
+ name: 'Purple'
+ },
+ {
+ name: 'Red'
+ },
+ {
+ name: 'Teal'
+ },
+ {
+ name: 'Yellow'
+ },
+ {
+ name: 'Black'
+ },
+ {
+ name: 'I\'ll choose on my own',
+ value: false
+ }
+ ],
+ when: when.customize
+ },
+ {
+ type: 'input',
+ name: 'PrimaryHex',
+ message: 'Enter a hexcode for your primary brand color',
+ when: when.primaryColor
+ },
+ {
+ type: 'list',
+ name: 'secondaryColor',
+ message: 'Select the closest name for your secondary brand color',
+ default: '14px',
+ choices: [
+ {
+ name: 'Blue'
+ },
+ {
+ name: 'Green'
+ },
+ {
+ name: 'Orange'
+ },
+ {
+ name: 'Pink'
+ },
+ {
+ name: 'Purple'
+ },
+ {
+ name: 'Red'
+ },
+ {
+ name: 'Teal'
+ },
+ {
+ name: 'Yellow'
+ },
+ {
+ name: 'Black'
+ },
+ {
+ name: 'I\'ll choose on my own',
+ value: false
+ }
+ ],
+ when: when.customize
+ },
+ {
+ type: 'input',
+ name: 'secondaryHex',
+ message: 'Enter a hexcode for your secondary brand color',
+ when: when.secondaryColor
+ }
+ ]
+
+ },
+
+ settings: {
+
+ /* Rename Files */
+ rename: {
+ json : { extname : '.json' }
+ },
+
+ /* Copy Install Folders */
+ wrench: {
+
+ // overwrite existing files update & install (default theme / definition)
+ overwrite: {
+ forceDelete : true,
+ excludeHiddenUnix : true,
+ preserveFiles : false
+ },
+
+ // only create files that don't exist (site theme update)
+ merge: {
+ forceDelete : false,
+ excludeHiddenUnix : true,
+ preserveFiles : true
+ }
+
+ }
+ }
+};
diff --git a/src/wwwroot/libraries/fomantic/tasks/config/project/release.js b/src/wwwroot/libraries/fomantic/tasks/config/project/release.js
new file mode 100644
index 0000000..20999d1
--- /dev/null
+++ b/src/wwwroot/libraries/fomantic/tasks/config/project/release.js
@@ -0,0 +1,65 @@
+/*******************************
+ Release Config
+*******************************/
+
+var
+ requireDotFile = require('require-dot-file'),
+ config,
+ npmPackage,
+ version
+;
+
+
+/*******************************
+ Derived Values
+*******************************/
+
+try {
+ config = requireDotFile('semantic.json');
+}
+catch(error) {}
+
+
+try {
+ npmPackage = require('../../../package.json');
+}
+catch(error) {
+ // generate fake package
+ npmPackage = {
+ name: 'Unknown',
+ version: 'x.x'
+ };
+}
+
+// looks for version in config or package.json (whichever is available)
+version = (npmPackage && npmPackage.version !== undefined && npmPackage.name == 'fomantic-ui')
+ ? npmPackage.version
+ : config.version
+;
+
+
+/*******************************
+ Export
+*******************************/
+
+module.exports = {
+
+ title : 'Fomantic UI',
+ repository : 'https://github.com/fomantic/Fomantic-UI',
+ url : 'http://fomantic-ui.com/',
+
+ banner: ''
+ + ' /*' + '\n'
+ + ' * # <%= title %> - <%= version %>' + '\n'
+ + ' * <%= repository %>' + '\n'
+ + ' * <%= url %>' + '\n'
+ + ' *' + '\n'
+ + ' * Copyright 2014 Contributors' + '\n'
+ + ' * Released under the MIT license' + '\n'
+ + ' * http://opensource.org/licenses/MIT' + '\n'
+ + ' *' + '\n'
+ + ' */' + '\n',
+
+ version : version
+
+};