@kadconsulting/dry
Version:
KAD Reusable Component Library
145 lines (144 loc) • 6.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.removeComponent = exports.updateIndices = exports.generateComponent = exports.initProject = void 0;
const masterComponentList = require('./masterComponentList.cjs');
const templates_1 = require('./templates.cjs');
const format_1 = require('./format.cjs');
const fs = require("fs");
const capitalizeWord = (word) => {
const newWord = word.split('');
const firstLetter = newWord[0].toUpperCase();
newWord.splice(0, 1, firstLetter);
return newWord.join('');
};
function capitalizeComponentNames(componentList) {
const capitalizedComponentList = {};
for (const category in componentList) {
capitalizedComponentList[category] = componentList[category].map((componentName) => capitalizeWord(componentName));
}
return capitalizedComponentList;
}
const capitalizedComponentList = capitalizeComponentNames(masterComponentList.ComponentList);
function initProject() {
const directories = ['src/components'];
directories.forEach((dir) => {
ensureDirectoryExistence(dir);
});
const indexFile = { path: 'src/components/index.js', content: templates_1.indexTemplate };
if (!fs.existsSync(indexFile.path)) {
fs.writeFileSync(indexFile.path, indexFile.content);
process.stdout.write(`\nCreated: ${indexFile.path}`);
}
else {
process.stdout.write(`\nSkipped: ${indexFile.path} (already exists)`);
}
function createAllComponents() {
for (const category in capitalizedComponentList) {
const components = capitalizedComponentList[category];
components.forEach((componentName) => {
generateComponent(componentName, category);
});
}
}
createAllComponents();
}
exports.initProject = initProject;
function generateComponent(componentName, category = '', skipStory = false) {
const formattedComponentName = capitalizeWord(componentName);
const componentDir = `src/components/${category ? `${category}/` : ''}${formattedComponentName}`;
ensureDirectoryExistence(componentDir);
const lowerCaseComponentName = componentName.toLowerCase();
const componentFiles = [
{
path: `${componentDir}/${formattedComponentName}.tsx`,
content: (0, templates_1.componentTemplate)(formattedComponentName, lowerCaseComponentName),
},
{
path: `${componentDir}/index.ts`,
content: (0, templates_1.componentIndexTemplate)(formattedComponentName),
},
{
path: `${componentDir}/${formattedComponentName}Types.ts`,
content: (0, templates_1.componentTypesTemplate)(formattedComponentName),
},
{
path: `${componentDir}/${formattedComponentName}Readme.md`,
content: (0, templates_1.componentReadmeTemplate)(formattedComponentName),
},
{
path: `${componentDir}/${formattedComponentName}.scss`,
content: (0, templates_1.stylesTemplate)(lowerCaseComponentName),
},
{
path: `${componentDir}/${formattedComponentName}.test.tsx`,
content: (0, templates_1.componentTestTemplate)(formattedComponentName, lowerCaseComponentName),
},
];
if (!skipStory) {
componentFiles.push({
path: `${componentDir}/${formattedComponentName}.stories.tsx`,
content: (0, templates_1.componentStoryTemplate)(formattedComponentName),
});
}
function createFile(filePath, content) {
return new Promise((resolve, reject) => {
fs.writeFile(filePath, content, (error) => {
if (error) {
reject(error);
}
else {
process.stdout.write(`\nCreated: ${filePath}`);
resolve();
}
});
});
}
const componentFilesPromises = componentFiles.map((file) => createFile(file.path, file.content));
Promise.all(componentFilesPromises).then(() => {
// TODO: this takes a long time for super build, so we should look to see if this is the best way to this.
(0, format_1.default)(componentDir);
process.stdout.write('\nformatted');
});
}
exports.generateComponent = generateComponent;
function updateIndices() {
const rootDir = 'src/components';
let exportIndexContent = '';
let exportTypesContent = '';
const categories = fs
.readdirSync(rootDir, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name);
categories.forEach((category) => {
const categoryPath = `${rootDir}/${category}`;
const components = fs
.readdirSync(categoryPath, { withFileTypes: true })
.filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name);
components.forEach((component) => {
exportIndexContent += `export { ${component} } from './${category}/${component}';\n`;
exportTypesContent += `export type { ${component}Props } from './${category}/${component}/${component}Types';\n`;
});
});
fs.writeFileSync(`${rootDir}/index.ts`, exportIndexContent);
fs.writeFileSync(`${rootDir}/types.ts`, exportTypesContent);
}
exports.updateIndices = updateIndices;
function removeComponent(componentName, category = '') {
const formattedComponentName = capitalizeWord(componentName);
const componentDir = `src/components/${category ? `${category}/` : ''}${formattedComponentName}`;
if (fs.existsSync(componentDir)) {
fs.rmdirSync(componentDir, { recursive: true });
process.stdout.write(`\nRemoved: ${componentDir}`);
}
else {
process.stdout.write(`\nSkipped: ${componentDir} (does not exist)`);
}
}
exports.removeComponent = removeComponent;
function ensureDirectoryExistence(dirPath) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
process.stdout.write(`\nCreated directory: ${dirPath}`);
}
}