bin/helpers/createFrontCanvas.js
'use strict';
/*
* This file is used to create a canvas for front app & link bundle
*/
const fs = require('fs-extra');
const kuler = require('kuler');
const program = require('commander');
const path = require('path');
const to = require('await-to-js').default;
const replace = require('replace-in-file');
program
.version('0.1.0')
.option('-p, --project <string>', 'Name of the client platform project')
.parse(process.argv);
if (!program.project) {
console.error(kuler('You did not specify a name project to copy canvas to .. ', 'orange'));
process.exit(0);
}
const pathToClient = path.resolve(__dirname, '../../client');
const pathToMobicoopBundle = path.resolve(pathToClient, 'src/MobicoopBundle');
const destinationProject = path.resolve(__dirname, `../../../${program.project}-platform`);
const pathToClientAssets = path.resolve(pathToMobicoopBundle, 'Resources/assets');
const destinationAssets = path.resolve(destinationProject, 'assets');
const translationsPath = path.resolve(destinationProject, 'translations');
/** -------------------------------------------------
Start the creation
*-----------------------------------------------------*/
createCanvas().then(_ => {
crawlDir(destinationAssets);
crawlDir(translationsPath, '{}', '.json');
replaceDataInCanvas().then(_ => console.log('ok')).catch(err => console.error(err))
})
/**
* Main function to create new client
*/
async function createCanvas() {
/**
* Create the dir folder base on name sent
*/
let err, exists, success, folders;
[err, exists] = await to(fs.mkdirp(destinationProject));
if (err) {
console.error(kuler(`Path specified is not writable or already exists! ${destinationProject} \n`, 'red'));
console.error(err);
process.exit(0);
}
/**
* Copy all client files but filters to destination
*/
const filter = {
elementToExclude: ['MobicoopBundle', 'node_modules', 'vendor', 'var', 'cypress.json', 'cypress', 'build', 'phpunit.xml.dist', 'assets', 'database', 'package-lock.json', 'kahlan-config.php', 'tests', 'package.json', 'README.md'],
// extToExclude: ['.lock'],
filter: function (currentPath) {
if (this.elementToExclude.includes(path.basename(currentPath))) { return false; }
return true;
}
};
console.log(kuler(`Copying files to ${destinationProject}\n`, 'green'));
[err, success] = await to(fs.copy(pathToClient, destinationProject, filter));
if (err) {
console.error(kuler('Cannot copy to specified path!\n', 'red'));
console.error(err);
process.exit(0);
}
/**
* Create Assets structure
*/
const filterAssets = {
elementToExclude: ['config','client'],
filter: function (currentPath) {
let assetsToKeep = ['_variables.scss', 'app.scss']
let basename = path.basename(currentPath);
let stats = fs.lstatSync(currentPath);
if ((!stats.isDirectory() && !assetsToKeep.includes(basename)) || (this.elementToExclude.includes(path.basename(currentPath)))) { return false; }
return true;
}
};
fs.mkdirp(destinationAssets);
console.log(kuler(`Creating assets structure into ${destinationAssets} \n`, 'green'));
[err, success] = await to(fs.copy(pathToClientAssets, destinationAssets, filterAssets));
if (err) {
console.error(kuler('Cannot copy to specified path!\n', 'red'));
console.error(err);
process.exit(0);
}
/**
* Copy specific client assets (client-canvas-folder)
*/
console.log(kuler(`Copying specific assets for ${destinationAssets} 🚀 \n`, 'pink'));
let appjs = path.resolve(__dirname, 'client-canvas/app.js');
let mainscss = path.resolve(__dirname, 'client-canvas/main.scss');
let webpackConfig = path.resolve(__dirname, 'client-canvas/webpack.config.js');
let themes = path.resolve(pathToMobicoopBundle, './Resources/themes');
let clientjs = path.resolve(pathToMobicoopBundle, './Resources/assets/js/client');
let translationsComponents = path.resolve(translationsPath, './components');
let gitignore = path.resolve(__dirname, 'client-canvas/.gitignore');
let gitexclude = path.resolve(__dirname, 'client-canvas/.gitlab-exclude');
let dcbl = path.resolve(__dirname, 'client-canvas/docker-compose-builder-linux.yml');
let dcbd = path.resolve(__dirname, 'client-canvas/docker-compose-builder-darwin.yml');
let dcl = path.resolve(__dirname, 'client-canvas/docker-compose-linux.yml');
let dcd = path.resolve(__dirname, 'client-canvas/docker-compose-darwin.yml');
let gitlabci = path.resolve(__dirname, 'client-canvas/.gitlab-ci.yml');
let postDeploy = path.resolve(__dirname, 'client-canvas/postDeploy.sh');
let packagejson = path.resolve(__dirname, 'client-canvas/package.json');
let makefile = path.resolve(__dirname, 'client-canvas/makefile');
let readme = path.resolve(__dirname, 'client-canvas/README.md');
let entryBuilder = path.resolve(__dirname, 'client-canvas/entrypoint-builder.sh');
let entry = path.resolve(__dirname, 'client-canvas/entrypoint.sh');
let bundles = path.resolve(__dirname, 'client-canvas/bundles');
[err, success] = await to(fs.copy(appjs, `${destinationAssets}/js/app.js`));
[err, success] = await to(fs.copy(mainscss, `${destinationAssets}/css/main.scss`));
[err, success] = await to(fs.copy(webpackConfig, `${destinationProject}/webpack.config.js`));
[err, success] = await to(fs.copy(dcbd, `${destinationProject}/docker-compose-builder-darwin.yml`));
[err, success] = await to(fs.copy(dcbl, `${destinationProject}/docker-compose-builder-linux.yml`));
[err, success] = await to(fs.copy(dcd, `${destinationProject}/docker-compose-darwin.yml`));
[err, success] = await to(fs.copy(dcl, `${destinationProject}/docker-compose-linux.yml`));
[err, success] = await to(fs.copy(packagejson, `${destinationProject}/package.json`));
[err, success] = await to(fs.copy(gitlabci, `${destinationProject}/.gitlab-ci.yml`));
[err, success] = await to(fs.copy(postDeploy, `${destinationProject}/postDeploy.sh`));
[err, success] = await to(fs.copy(makefile, `${destinationProject}/makefile`));
[err, success] = await to(fs.copy(readme, `${destinationProject}/README.md`));
[err, success] = await to(fs.copy(gitignore, `${destinationProject}/.gitignore`));
[err, success] = await to(fs.copy(gitexclude, `${destinationProject}/.gitlab-exclude`));
[err, success] = await to(fs.copy(entryBuilder, `${destinationProject}/entrypoint-builder.sh`));
[err, success] = await to(fs.copy(entry, `${destinationProject}/entrypoint.sh`));
[err, success] = await to(fs.copy(bundles, `${destinationProject}/templates/bundles`));
[err, success] = await to(fs.copy(themes, `${destinationProject}/themes`));
[err, success] = await to(fs.copy(clientjs, `${destinationProject}/assets/js`));
[err, success] = await to(fs.copy(translationsComponents, `${destinationProject}/translations/components`));
}
/**
* Replace some text to help the creation of the new client platform
*/
async function replaceDataInCanvas() {
const optionsName = {
files: `${destinationProject}/**/*`,
from: /\$\$NAME\$\$/gi,
to: `${program.project}-platform`,
};
const optionsInstance = {
files: `${destinationProject}/.gitlab-ci.yml`,
from: /\$\$INSTANCE\$\$/gi,
to: `${program.project}`,
};
const optionsPlatformNameEnv = {
files: `${destinationProject}/.env`,
from: /APP_NAME=mobicoop_platform/gi,
to: `APP_NAME=${program.project}-platform`,
};
const optionsAssetsEnv = {
files: `${destinationProject}/.env`,
from: /ASSETS_PREFIX=bundle_/gi,
to: `ASSETS_PREFIX=`,
};
await replace(optionsName);
await replace(optionsInstance);
await replace(optionsPlatformNameEnv);
await replace(optionsAssetsEnv);
}
/**
* recursively crawl directory from dir entrypoint & add a gitkeep inside all folders!
* @param {string} dir
*/
function crawlDir(dir, replace, ext) {
fs.readdirSync(dir).forEach(element => {
let fullPath = path.join(dir, element);
if (fs.lstatSync(fullPath).isFile() && replace && path.extname(fullPath) === ext) {
fs.writeFileSync(fullPath, replace);
}
if (fs.lstatSync(fullPath).isDirectory()) {
// add a gitkeep inside all directory strcutures so that they stay in git!
fs.writeFileSync(`${fullPath}/.gitkeep`, '');
crawlDir(fullPath, replace, ext);
}
});
}