@liferay/generator-js
Version:
Yeoman generators for Liferay DXP and Portal CE JavaScript projects.
240 lines (239 loc) • 8.28 kB
JavaScript
;
/**
* 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;