-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreateBlock.js
121 lines (105 loc) · 5.12 KB
/
createBlock.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
'use strict';
// Генератор файлов блока
// Использование: node createBlock.js [имя блока] [доп. расширения через пробел]
const fs = require('fs');
const projectConfig = require('./projectConfig.json');
const dirs = projectConfig.dirs;
const mkdirp = require('mkdirp');
const blockName = process.argv[2]; // получим имя блока
const defaultExtensions = ['scss']; // расширения по умолчанию
const extensions = uniqueArray(defaultExtensions.concat(process.argv.slice(3))); // добавим введенные при вызове расширения (если есть)
// Если есть имя блока
if (blockName) {
const dirPath = `${dirs.srcPath + dirs.blocksDirName}/${blockName}/`; // полный путь к создаваемой папке блока
mkdirp(dirPath, (err) => { // создаем
// Если какая-то ошибка — покажем
if (err) {
console.error(`Отмена операции: ${err}`);
}
// Нет ошибки, поехали!
else {
console.log(`Создание папки ${dirPath} (если отсутствует)`);
// Обходим массив расширений и создаем файлы, если они еще не созданы
extensions.forEach((extention) => {
const filePath = `${dirPath + blockName}.${extention}`; // полный путь к создаваемому файлу
let fileContent = ''; // будущий контент файла
let fileCreateMsg = ''; // будущее сообщение в консоли при создании файла
// Если это SCSS
if (extention === 'scss') {
fileContent = `.${blockName} {\n\n}\n`;
// fileCreateMsg = '';
// fileCreateMsg = '';
// Добавим созданный файл
let hasThisBlock = false;
for (const block in projectConfig.blocks) {
if (block === blockName) {
hasThisBlock = true;
break;
}
}
if (!hasThisBlock) {
projectConfig.blocks[blockName] = [];
const newPackageJson = JSON.stringify(projectConfig, '', 2);
fs.writeFileSync('./projectConfig.json', newPackageJson);
fileCreateMsg = 'Подключение блока добавлено в projectConfig.json';
}
}
// Если это HTML
else if (extention === 'html') {
fileContent = `<!--DEV\n\nДля использования этого файла как шаблона:\n\n@ @include('blocks/${blockName}/${blockName}.html')\n\n(Нужно убрать пробел между символами @)\nПодробнее: https://www.npmjs.com/package/gulp-file-include\n\n\n\n<div class="${blockName}">content</div>\n\n-->\n`;
// fileCreateMsg = '';
}
// Если это JS
else if (extention === 'js') {
fileContent = '// document.addEventListener(\'DOMContentLoaded\', function(){});\n// (function(){\n// код\n// }());\n';
}
// Если нужна подпапка для картинок
else if (extention === 'img') {
const imgFolder = `${dirPath}img/`;
if (fileExist(imgFolder) === false) {
mkdirp(imgFolder, (err) => {
if (err) console.error(err);
else console.log(`Создание папки: ${imgFolder} (если отсутствует)`);
});
} else {
console.log(`Папка ${imgFolder} НЕ создана (уже существует) `);
}
}
// Создаем файл, если он еще не существует
if (fileExist(filePath) === false && extention !== 'img') {
fs.writeFile(filePath, fileContent, (err) => {
if (err) {
return console.log(`Файл НЕ создан: ${err}`);
}
console.log(`Файл создан: ${filePath}`);
if (fileCreateMsg) {
console.warn(fileCreateMsg);
}
});
} else if (extention !== 'img') {
console.log(`Файл НЕ создан: ${filePath} (уже существует)`);
}
});
}
});
} else {
console.log('Отмена операции: не указан блок');
}
// Оставить в массиве только уникальные значения (убрать повторы)
function uniqueArray(arr) {
const objectTemp = {};
for (let i = 0; i < arr.length; i++) {
const str = arr[i];
objectTemp[str] = true; // запомнить строку в виде свойства объекта
}
return Object.keys(objectTemp);
}
// Проверка существования файла
function fileExist(path) {
const fs = require('fs');
try {
fs.statSync(path);
} catch (err) {
return !(err && err.code === 'ENOENT');
}
}