wishthis/semantic/tasks/admin/distributions/create.js
2023-08-17 11:47:40 +02:00

202 lines
7 KiB
JavaScript

/*******************************
Create Distributions
*******************************/
/*
This will create individual distribution repositories for each SUI distribution
* copy distribution files to release
* update package.json file
*/
const
gulp = require('gulp'),
// node dependencies
fs = require('fs'),
path = require('path'),
mergeStream = require('merge-stream'),
// admin dependencies
flatten = require('gulp-flatten'),
jsonEditor = require('gulp-json-editor'),
plumber = require('gulp-plumber'),
rename = require('gulp-rename'),
replace = require('gulp-replace'),
// config
config = require('../../config/user'),
release = require('../../config/admin/release'),
project = require('../../config/project/release'),
// shorthand
version = project.version,
output = config.paths.output
;
module.exports = function (callback) {
let
stream,
index,
tasks = []
;
for (index in release.distributions) {
let
distribution = release.distributions[index]
;
// streams... designed to save time and make coding fun...
(function (distribution) {
let
distLowerCase = distribution.toLowerCase(),
outputDirectory = path.join(release.outputRoot, distLowerCase),
packageFile = path.join(outputDirectory, release.files.npm),
repoName = release.distRepoRoot + distribution,
regExp = {
match: {
files: '{files}',
version: '{version}',
},
},
task = {
all: distribution + ' copying files',
repo: distribution + ' create repo',
meteor: distribution + ' create meteor package.js',
package: distribution + ' create package.json',
},
gatherFiles,
createList
;
// get files for meteor
gatherFiles = function (dir) {
dir = dir || path.resolve('.');
let
list = fs.readdirSync(dir),
omitted = [
'.git',
'node_modules',
'package.js',
'LICENSE',
'README.md',
'package.json',
'bower.json',
'.gitignore',
],
files = []
;
list.forEach(function (file) {
let
isOmitted = omitted.indexOf(file) > -1,
filePath = path.join(dir, file),
stat = fs.statSync(filePath)
;
if (!isOmitted) {
if (stat && stat.isDirectory()) {
files = files.concat(gatherFiles(filePath));
} else {
files.push(filePath.replace(outputDirectory + path.sep, ''));
}
}
});
return files;
};
// spaces out list correctly
createList = function (files) {
let filenames = '';
for (let file in files) {
filenames += "'" + files[file] + "'"
+ (file === files.length - 1 ? '' : ',\n ');
}
return filenames;
};
tasks.push(function () {
let
files = gatherFiles(outputDirectory),
filenames = createList(files)
;
gulp.src(release.templates.meteor[distLowerCase])
.pipe(plumber())
.pipe(flatten())
.pipe(replace(regExp.match.version, version))
.pipe(replace(regExp.match.files, filenames))
.pipe(rename(release.files.meteor))
.pipe(gulp.dest(outputDirectory))
;
});
if (distribution === 'CSS') {
tasks.push(function () {
let
themes,
components,
releases
;
themes = gulp.src('dist/themes/default/**/*', { base: 'dist/' })
.pipe(gulp.dest(outputDirectory))
;
components = gulp.src('dist/components/*', { base: 'dist/' })
.pipe(gulp.dest(outputDirectory))
;
releases = gulp.src('dist/*', { base: 'dist/' })
.pipe(gulp.dest(outputDirectory))
;
return mergeStream(themes, components, releases);
});
} else if (distribution === 'LESS') {
tasks.push(function () {
let
definitions,
themeImport,
themeConfig,
siteTheme,
themes
;
definitions = gulp.src('src/definitions/**/*', { base: 'src/' })
.pipe(gulp.dest(outputDirectory))
;
themeImport = gulp.src('src/semantic.less', { base: 'src/' })
.pipe(gulp.dest(outputDirectory))
;
themeImport = gulp.src('src/theme.less', { base: 'src/' })
.pipe(gulp.dest(outputDirectory))
;
themeConfig = gulp.src('src/theme.config.example', { base: 'src/' })
.pipe(gulp.dest(outputDirectory))
;
siteTheme = gulp.src('src/_site/**/*', { base: 'src/' })
.pipe(gulp.dest(outputDirectory))
;
themes = gulp.src('src/themes/**/*', { base: 'src/' })
.pipe(gulp.dest(outputDirectory))
;
return mergeStream(definitions, themeImport, themeConfig, siteTheme, themes);
});
}
// extend package.json
tasks.push(function () {
return gulp.src(packageFile)
.pipe(plumber())
.pipe(jsonEditor(function (pkg) {
if (version) {
pkg.version = version;
}
return pkg;
}))
.pipe(gulp.dest(outputDirectory))
;
});
})(distribution);
}
gulp.series(...tasks)(callback);
};