You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.2 KiB
153 lines
4.2 KiB
import path from 'path';
|
|
import Generator from "yeoman-generator";
|
|
import mkdirp from "mkdirp";
|
|
import {fileURLToPath} from 'url';
|
|
import {capitalize} from "../../helpers.js";
|
|
import memFs from 'mem-fs';
|
|
import editor from 'mem-fs-editor';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
|
|
const baseDir = path.join(__dirname, '../../');
|
|
|
|
// export const defaultGitRepo = 'git+https://roman-axe-web@bitbucket.org/axeweb/create-block-dev-tool.git#master';
|
|
export const defaultGitRepo = '@axe-web/create-block@1.0.8';
|
|
|
|
export default class extends Generator {
|
|
async prompting() {
|
|
this.data = await this.prompt([
|
|
{
|
|
type: "input",
|
|
name: "name",
|
|
message: "Block Name",
|
|
validate: (str) => {
|
|
const matches = str.match(/\d+/g);
|
|
|
|
if (matches != null) {
|
|
return false;
|
|
}
|
|
|
|
return !!str;
|
|
}
|
|
},
|
|
{
|
|
type: "input",
|
|
name: "group",
|
|
message: "Company/Organization Name",
|
|
validate: (str) => {
|
|
const matches = str.match(/\d+/g);
|
|
|
|
if (matches != null) {
|
|
return false;
|
|
}
|
|
|
|
return !!str;
|
|
}
|
|
},
|
|
{
|
|
type: "list",
|
|
name: "baseView",
|
|
message: "View Template",
|
|
default: 'container',
|
|
choices: ['container', 'alignfull'],
|
|
},
|
|
{
|
|
type: "number",
|
|
name: "remToPx",
|
|
message: "Provide declaration of 1rem:",
|
|
default: 16
|
|
},
|
|
{
|
|
type: 'input',
|
|
name: 'devToolSource',
|
|
message: 'DevTool Version/Source (master)',
|
|
default: defaultGitRepo
|
|
}
|
|
]);
|
|
}
|
|
|
|
writing() {
|
|
const title = capitalize(this.data.name);
|
|
const group = capitalize(this.data.group);
|
|
const data = Object.assign(this.data, {
|
|
title,
|
|
version: '1.0.0',
|
|
blockFilename: title.toLowerCase().replace(/ /ig, '-'),
|
|
blockGroupName: group.toLowerCase().replace(/ /ig, '-'),
|
|
blockClassName: title.toLowerCase().replace(/ /ig, '_'),
|
|
});
|
|
|
|
const pathDist = path.join(baseDir, 'blocks', data.blockFilename);
|
|
|
|
this.fs.copyTpl(
|
|
this.templatePath('config/default.cjs'),
|
|
this.destinationPath(path.join(pathDist, 'config', 'default.cjs')),
|
|
data
|
|
);
|
|
|
|
|
|
// SRC Template files
|
|
this.fs.copyTpl(
|
|
this.templatePath('src/template.template.hbs'),
|
|
this.destinationPath(path.join(pathDist, 'src', data.blockFilename + '.template.hbs')),
|
|
data
|
|
);
|
|
|
|
this.fs.copyTpl(
|
|
this.templatePath('src/styles/template.scss'),
|
|
this.destinationPath(path.join(pathDist, 'src', 'styles', data.blockFilename + '.scss')),
|
|
data
|
|
);
|
|
|
|
this.fs.copyTpl(
|
|
this.templatePath('src/scripts/template.js'),
|
|
this.destinationPath(path.join(pathDist, 'src', 'scripts', data.blockFilename + '.js')),
|
|
data
|
|
);
|
|
|
|
this.fs.copyTpl(
|
|
this.templatePath('src/images/demo.jpeg'),
|
|
this.destinationPath(path.join(pathDist, 'src', 'images', 'demo.jpeg')),
|
|
data
|
|
);
|
|
|
|
// Design Directory
|
|
mkdirp.sync(path.join(pathDist, 'design'));
|
|
|
|
// Data Files
|
|
this.fs.copyTpl(
|
|
this.templatePath('data/default.json'),
|
|
this.destinationPath(path.join(pathDist, 'data', 'default.json')),
|
|
data
|
|
);
|
|
|
|
this.fs.copyTpl(
|
|
this.templatePath('data/advanced.json'),
|
|
this.destinationPath(path.join(pathDist, 'data', 'advanced.json')),
|
|
data
|
|
);
|
|
|
|
// Technical Project files.
|
|
createTechnicalFiles(data, baseDir, `blocks/${data.name}`).then();
|
|
}
|
|
}
|
|
|
|
export async function createTechnicalFiles(data, baseDir, distPath) {
|
|
const pathDist = distPath; //path.join(baseDir, distPath);
|
|
const generatorsPath = path.join(baseDir, 'generators/block/templates');
|
|
|
|
const store = memFs.create();
|
|
const filesystem = editor.create(store);
|
|
|
|
const files = ['package.json', 'README.md', '.editorconfig', {from: 'gitignore', to: '.gitignore'}, 'block.json'];
|
|
|
|
for (let file of files) {
|
|
const from = typeof file !== 'string' ? `${generatorsPath}/${file.from}` : `${generatorsPath}/${file}`;
|
|
const to = typeof file !== 'string' ? `${pathDist}/${file.to}` : `${pathDist}/${file}`;
|
|
|
|
await filesystem.copyTplAsync(from, to, data);
|
|
}
|
|
|
|
return filesystem.commit(); // Promise
|
|
}
|
|
|