UNPKG

@liferay/generator-js

Version:

Yeoman generators for Liferay DXP and Portal CE JavaScript projects.

240 lines (239 loc) 8.28 kB
"use strict"; /** * SPDX-FileCopyrightText: © 2017 Liferay, Inc. <https://liferay.com> * SPDX-License-Identifier: LGPL-3.0-or-later */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateLiferayDir = exports.toHumanReadable = exports.promptWithConfig = exports.hyphenate = exports.getSDKVersion = exports.getPortletName = exports.formatLabels = exports.Copier = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); // eslint-disable-next-line @typescript-eslint/no-var-requires const pkgJson = require('../../package.json'); const cfg = __importStar(require("../config")); /** * A class to help copying Yeoman templates. */ class Copier { /** * @param {Generator} generator a Yeoman generator */ constructor(generator) { this._generator = generator; } /** * Instantiate a Yeoman template file. * @param {String} src path to template * @param {Object} context optional context object to use when * instantiating the template (defaults to {}) * @param {String} dest optional destination name (defaults to src) */ copyFile(src, { context = {}, dest = undefined } = {}) { const gen = this._generator; const fullContext = { ...gen.answers, ...context, }; dest = dest || src; gen.fs.copyTpl(gen.templatePath(`${src}.ejs`), gen.destinationPath(dest), fullContext); } /** * Instantiate all Yeoman template files found in a directory tree. * @param {String} src path to template * @param {Object} context optional context object to use when * instantiating the template (defaults to {}) */ copyDir(src, { context = {} } = {}) { const gen = this._generator; const files = fs_1.default.readdirSync(gen.templatePath(src)); files.forEach((file) => { if (file === '.DS_Store') { return; } const filePath = path_1.default.join(src, file); if (fs_1.default.statSync(gen.templatePath(filePath)).isDirectory()) { this.copyDir(filePath, { context }); } else { this.copyFile(filePath.replace(/\.ejs$/, ''), { context }); } }); } } exports.Copier = Copier; /** * Format label values according to different formats. * @param {object} labels * @return {object} returns an object with labels transformed according to * different formats: 'raw', 'quoted', 'template', 'js' */ function formatLabels(labels) { return { js: Object.keys(labels).reduce((obj, key) => { obj[key] = `Liferay.Language.get('${hyphenate(key)}')`; return obj; }, {}), jsx: Object.keys(labels).reduce((obj, key) => { obj[key] = `{Liferay.Language.get('${hyphenate(key)}')}`; return obj; }, {}), quoted: Object.entries(labels).reduce((obj, [key, value]) => { obj[key] = `'${value}'`; return obj; }, {}), raw: labels, template: Object.keys(labels).reduce((obj, key) => { obj[key] = `\${Liferay.Language.get('${hyphenate(key)}')}`; return obj; }, {}), }; } exports.formatLabels = formatLabels; /** * Get the portlet name. * @param {ProjectAnalyzer} projectAnalyzer * @return {string} */ function getPortletName(projectAnalyzer) { let portletName = projectAnalyzer.name; portletName = portletName.replace(/-/g, ''); portletName = portletName.replace(/[^A-Za-z0-9]/g, '_'); return portletName; } exports.getPortletName = getPortletName; /** * Get the semver constraints for a SDK package based on user's * .generator-liferay-js.json file and running SDK version. * @param {string} packageName * @param {boolean} ignoreConfig return the true SDK version */ function getSDKVersion(packageName, { ignoreConfig = false } = {}) { let version = `^${pkgJson.version}`; if (ignoreConfig) { return version; } const sdkVersion = cfg.getSDKVersion(); if (sdkVersion) { if (Number.isNaN(parseInt(sdkVersion.charAt(0), 10))) { version = `${sdkVersion}/packages/${packageName}`; } else { version = sdkVersion; } } return version; } exports.getSDKVersion = getSDKVersion; /** * Convert key from camel case to hyphens. * @param {string} key * @return {string} */ function hyphenate(key) { let ret = ''; for (let i = 0; i < key.length; i++) { let char = key.charAt(i); if (char === char.toUpperCase()) { char = `-${char.toLowerCase()}`; } ret += char; } return ret; } exports.hyphenate = hyphenate; /** * A function to process prompts as specified in the configuration file. * @param {Generator} generator a Yeoman generator * @param {string} namespace the generator namespace as defined in * config.getDefaultAnswer() * @param {Array} prompts a Yeoman prompts array * @return {object} the set of answers */ async function promptWithConfig(generator, namespace, prompts) { if (Array.isArray(namespace)) { prompts = namespace; namespace = generator.namespace; } // Tweak defaults with config values prompts = prompts.map((prompt) => { let defaultDefault = undefined; if (prompt.default !== undefined) { defaultDefault = prompt.default; } prompt.default = cfg.getDefaultAnswer(namespace, prompt.name, defaultDefault); return prompt; }); // Decide wether to run in batch or interactive mode if (cfg.batchMode()) { return prompts.reduce((answers, prompt) => { answers[prompt.name] = prompt.default; return answers; }, {}); } else { return await generator.prompt(prompts); } } exports.promptWithConfig = promptWithConfig; /** * Converts a technical string to human readable form. * @param {string} string string to capitalize * @return {string} */ function toHumanReadable(string) { let capitalizeNext = true; let humanizedString = ''; for (let i = 0; i < string.length; i++) { if (string[i].match(/[\\._-]/)) { humanizedString += ' '; capitalizeNext = true; } else { if (capitalizeNext) { humanizedString += string[i].toLocaleUpperCase(); capitalizeNext = false; } else { humanizedString += string[i]; } } } return humanizedString; } exports.toHumanReadable = toHumanReadable; /** * Check if a given directory path contains a valid Liferay installation. * @param {String} input directory path * @return {boolean|string} */ function validateLiferayDir(input) { if (!fs_1.default.existsSync(input)) { return 'Directory does not exist'; } if (!fs_1.default.existsSync(path_1.default.join(input, 'osgi', 'modules'))) { return 'Directory does not look like a Liferay installation: osgi/modules directory is missing'; } return true; } exports.validateLiferayDir = validateLiferayDir;