UNPKG

@kadconsulting/dry

Version:
145 lines (144 loc) 6.14 kB
"use strict"; 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}`); } }