UNPKG

@forwardslashns/fws-cli

Version:

CLI meant to work together with other Forwardslash boilerplates.

90 lines (81 loc) 4.53 kB
import { checkIfOneOptionIsPresent } from '../util/checkIfOneOptionIsPresent.js'; import { createFile } from '../util/createFile.js'; import { updateScssFile } from '../util/updateScssFile.js'; import { getPackageMetadata } from '../package/index.js'; import { getDirType } from '../util/getDirType.js'; import { resolve } from 'path'; import _startCase from 'lodash.startcase'; import { validateDirectory } from '../util/validateDirectory.js'; import { createDirectory } from '../util/createDirectory.js'; import { rollBack } from '../util/rollBack.js'; import { isVueComponentExist } from '../util/isVueComponentExists.js'; import { getVueComponentDirectory } from '../util/getVueComponentDirectory.js'; import { generateVueFile } from '../util/generateVueFile.js'; import { generateVueStory } from '../util/generateVueStory.js'; import { getLogMessage } from '../util/getLogMessage.js'; const createFiles = { name: 'create-file', description: 'create component files', alias: 'cf', mandatoryOptions: [{ command: '-f, --file-name <filename>', description: 'file name, mandatory' }], additionalOptions: [ { command: '-b, --block', description: 'create WP block, 1 type of component mandatory' }, { command: '-l, --listing', description: 'create WP listing, 1 type of component mandatory' }, { command: '-p, --part', description: 'create WP part, 1 type of component mandatory' }, { command: '-B, --block-vue', description: 'create Vue block, 1 type of component mandatory' }, { command: '-P, --part-vue', description: 'create Vue part, 1 type of component mandatory' }, ], run(options) { const { fileName, block, listing, part, blockVue, partVue } = options; if (!fileName) { console.error('Please provide a file name.'); throw new Error('Script: create-file failed with code: 1'); } const { message, shouldExit } = checkIfOneOptionIsPresent(this.additionalOptions, [ block, listing, part, blockVue, partVue, ]); message && console.error(message); if (shouldExit) throw new Error('Script: create-file failed with code: 1'); const packageMetadata = getPackageMetadata(); if (!packageMetadata?.isValid) throw new Error('Script: create-file failed with code: 1'); const themeVersion = packageMetadata.packageJson?.version; const isNewWPStarter = themeVersion && parseInt(themeVersion.split('.')[0], 10) >= 4; const type = Object.entries(options)[1][0]; const dirName = _startCase(fileName).replace(/[\s]+/g, '-').toLowerCase(); const dirType = getDirType(type, isNewWPStarter); const dirPath = resolve(packageMetadata.projectRoot, `template-views/${dirType}s/${dirName}`); try { if (['block', 'listing', 'part'].includes(type) && packageMetadata.packageType === 'wp') { validateDirectory(dirPath, `ERROR: ${dirType} '${dirName}' already exists!`); createDirectory(dirPath); createFile(dirName, dirType, 'php', '', 'php', dirPath, packageMetadata); createFile(dirName, dirType, 'php-fe', '_fe-', 'php', dirPath, packageMetadata); createFile(dirName, dirType, 'scss', isNewWPStarter ? '' : '_', 'scss', dirPath, packageMetadata); if (!isNewWPStarter) { updateScssFile(packageMetadata.projectRoot, dirType, dirName); } } else if (['blockVue', 'partVue'].includes(type) && packageMetadata.packageType !== 'wp') { const vueComponentDir = getVueComponentDirectory(packageMetadata); const componentName = (_startCase(dirType) + _startCase(dirName)).replace(/[\s]+/g, ''); const filePath = resolve( packageMetadata.projectRoot, vueComponentDir + `/${dirType}s`, `${fileName}.vue` ); isVueComponentExist(filePath, componentName); generateVueFile(packageMetadata.packageType, componentName, fileName, filePath); generateVueStory(packageMetadata, componentName, dirType, fileName); } else { getLogMessage('Wrong package...', 'yellow'); } } catch (exception) { rollBack(); } }, }; createFiles.run = createFiles.run.bind(createFiles); export { createFiles };