UNPKG

@openshift-console/dynamic-plugin-sdk-webpack

Version:

Provides webpack ConsoleRemotePlugin used to build all dynamic plugin assets.

69 lines (68 loc) 3.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExtensionValidator = exports.findWebpackModules = exports.collectCodeRefData = void 0; const _ = require("lodash"); const coderef_resolver_1 = require("../coderefs/coderef-resolver"); const object_1 = require("../utils/object"); const BaseValidator_1 = require("./BaseValidator"); const collectCodeRefData = (extensions) => extensions.reduce((acc, e, index) => { const data = { index, propToCodeRefValue: {} }; (0, object_1.deepForOwn)(e.properties, coderef_resolver_1.isEncodedCodeRef, (ref, key) => { data.propToCodeRefValue[key] = ref.$codeRef; }); if (!_.isEmpty(data.propToCodeRefValue)) { acc.push(data); } return acc; }, []); exports.collectCodeRefData = collectCodeRefData; const findWebpackModules = (compilation, exposedModules) => { const webpackModules = Array.from(compilation.modules); return Object.keys(exposedModules).reduce((acc, moduleName) => { acc[moduleName] = webpackModules.find((m) => { const rawRequest = _.get(m, 'rawRequest') || _.get(m, 'rootModule.rawRequest'); return exposedModules[moduleName] === rawRequest; }); return acc; }, {}); }; exports.findWebpackModules = findWebpackModules; class ExtensionValidator extends BaseValidator_1.BaseValidator { validate(compilation, extensions, exposedModules) { const codeRefs = (0, exports.collectCodeRefData)(extensions); const webpackModules = (0, exports.findWebpackModules)(compilation, exposedModules); // Each exposed module must have at least one code reference Object.keys(exposedModules).forEach((moduleName) => { const moduleReferenced = codeRefs.some((data) => Object.values(data.propToCodeRefValue).some((value) => { const [parsedModuleName] = (0, coderef_resolver_1.parseEncodedCodeRefValue)(value); return parsedModuleName && moduleName === parsedModuleName; })); if (!moduleReferenced) { this.result.addError(`Exposed module '${moduleName}' is not referenced by any extension`); } }); // Each code reference must point to a valid webpack module export codeRefs.forEach((data) => { Object.entries(data.propToCodeRefValue).forEach(([propName, codeRefValue]) => { const [moduleName, exportName] = (0, coderef_resolver_1.parseEncodedCodeRefValue)(codeRefValue); const errorTrace = `in extension [${data.index}] property '${propName}'`; if (!moduleName || !exportName) { this.result.addError(`Invalid code reference '${codeRefValue}' ${errorTrace}`); return; } const foundModule = webpackModules[moduleName]; if (!foundModule) { this.result.addError(`Invalid module '${moduleName}' ${errorTrace}`); return; } const moduleExports = compilation.moduleGraph.getProvidedExports(foundModule); const exportValid = Array.isArray(moduleExports) && moduleExports.includes(exportName); if (!exportValid) { this.result.addError(`Invalid module export '${exportName}' ${errorTrace}`); } }); }); return this.result; } } exports.ExtensionValidator = ExtensionValidator;