UNPKG

@coat/cli

Version:

TODO: See #3

101 lines (93 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.gatherExtendedTemplates = gatherExtendedTemplates; var _path = _interopRequireDefault(require("path")); var _resolveFrom = _interopRequireDefault(require("resolve-from")); var _importFrom = _interopRequireDefault(require("import-from")); var _chalk = _interopRequireDefault(require("chalk")); var _groupBy = _interopRequireDefault(require("lodash/groupBy")); var _getStrictCoatManifest = require("../util/get-strict-coat-manifest"); var _coatManifest = require("../validation/coat-manifest"); var _validationIssue = require("../validation/validation-issue"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getTemplates(cwd, context, templateEntry) { let template; let templateConfig; // extends entries can either be plain strings or // tuples in the form of: // [templateName, templateConfig] if (Array.isArray(templateEntry)) { [template, templateConfig] = templateEntry; } else { template = templateEntry; // Default config is an empty object templateConfig = {}; } // Resolve the directory of the current template to // use it as the cwd for child templates. // // Especially in workspaces node_modules might be deduped // or child templates might live in the node_modules folder // of the template itself const templateDir = _path.default.dirname((0, _resolveFrom.default)(cwd, template)); // Import the current template // TODO: See #15 // Better error message when template can't be imported // with a hint to install node_modules const templateManifestRawModule = (0, _importFrom.default)(cwd, template); // Check whether the template exported its manifest or manifest function // as a default export or directly using module.exports let templateManifestRaw; if (typeof templateManifestRawModule === "object" && templateManifestRawModule !== null && "__esModule" in templateManifestRawModule && "default" in templateManifestRawModule) { templateManifestRaw = templateManifestRawModule.default; } else { templateManifestRaw = templateManifestRawModule; } let resolvedTemplate; if (typeof templateManifestRaw === "function") { resolvedTemplate = templateManifestRaw({ coatContext: context, config: templateConfig }); } else { resolvedTemplate = templateManifestRaw; } // Validate template const issues = [...(0, _coatManifest.validateCoatManifest)(resolvedTemplate, { isTemplate: true })]; if (issues.length) { const { [_validationIssue.ValidationIssueType.Error]: errors = [], [_validationIssue.ValidationIssueType.Warning]: warnings = [] } = (0, _groupBy.default)(issues, "type"); const validationMessages = [(0, _chalk.default)`The extended template "{green ${template}}" has the following issue${issues.length > 1 ? "s" : ""}:`, ""]; validationMessages.push(...warnings.map(warning => (0, _chalk.default)`{inverse.yellow.bold WARNING } - ${warning.message}`)); validationMessages.push(...errors.map(error => (0, _chalk.default)`{inverse.red.bold ERROR } - ${error.message}`)); validationMessages.push(""); console.error(validationMessages.join("\n")); if (errors.length) { throw new Error(`Validation of template "${template}" threw ${errors.length > 1 ? "errors" : "an error"}.`); } } const resolvedTemplateStrict = (0, _getStrictCoatManifest.getStrictCoatManifest)(resolvedTemplate); return [...resolvedTemplateStrict.extends.map(childTemplate => getTemplates(templateDir, context, childTemplate)), resolvedTemplateStrict]; } /** * Retrieves and imports all templates that are extended by a coat project. * * If a single child template is used by multiple templates, it will be not be * deduped in order to preserve any logic that depends on the child template being * available before the parent template is evaluated. * * @param context The context of the current coat project */ function gatherExtendedTemplates(context) { const results = context.coatManifest.extends.map(template => getTemplates(context.cwd, context, template)); // TODO: Temporary error due to TypeScript regression bug in 4.7 // See https://github.com/microsoft/TypeScript/issues/49280 // @ts-expect-error Temporary error due to TypeScript regression bug in 4.7 return results.flat(Infinity); }