UNPKG

zephyr-xpack-internal

Version:

Xpack internals for Zephyr

221 lines (220 loc) • 11.8 kB
"use strict"; var __webpack_modules__ = { "node:module" (module) { module.exports = require("node:module"); } }; var __webpack_module_cache__ = {}; function __webpack_require__(moduleId) { var cachedModule = __webpack_module_cache__[moduleId]; if (void 0 !== cachedModule) return cachedModule.exports; var module = __webpack_module_cache__[moduleId] = { exports: {} }; __webpack_modules__[moduleId](module, module.exports, __webpack_require__); return module.exports; } (()=>{ __webpack_require__.d = (exports1, getters, values)=>{ var define = (defs, kind)=>{ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, { enumerable: true, [kind]: defs[key] }); }; define(getters, "get"); define(values, "value"); }; })(); (()=>{ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop); })(); (()=>{ __webpack_require__.r = (exports1)=>{ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, { value: 'Module' }); Object.defineProperty(exports1, '__esModule', { value: true }); }; })(); var __webpack_exports__ = {}; (()=>{ __webpack_require__.r(__webpack_exports__); __webpack_require__.d(__webpack_exports__, { FederationDashboardPlugin: ()=>FederationDashboardPlugin, resolveFederationGraphConfiguration: ()=>resolveFederationGraphConfiguration }); const external_node_path_namespaceObject = require("node:path"); const external_zephyr_agent_namespaceObject = require("zephyr-agent"); const index_js_namespaceObject = require("../../../xpack-extract/index.js"); const convert_to_graph_js_namespaceObject = require("../convert-to-graph/convert-to-graph.js"); const external_add_runtime_requirement_to_promise_external_js_namespaceObject = require("./add-runtime-requirement-to-promise-external.js"); const external_compute_version_strategy_js_namespaceObject = require("./compute-version-strategy.js"); const external_find_package_json_js_namespaceObject = require("./find-package-json.js"); const { createRequire: createProjectRequire } = __webpack_require__("node:module"); function resolveFederationGraphConfiguration(mfConfig, fallback, applicationName) { const plugins = mfConfig ? Array.isArray(mfConfig) ? mfConfig : [ mfConfig ] : []; const configurations = plugins.flatMap((plugin)=>{ const config = (0, index_js_namespaceObject.extractFederatedConfig)(plugin); return config ? [ config ] : []; }); const resolvedConfigurations = configurations.length > 0 ? configurations : Object.keys(fallback).length > 0 ? [ fallback ] : []; const remoteNames = [ ...new Set(resolvedConfigurations.flatMap((config)=>(0, index_js_namespaceObject.parseRemotesAsEntries)(config.remotes).map(([remoteName])=>remoteName))) ]; return { configurations: resolvedConfigurations, graphConfiguration: 1 === resolvedConfigurations.length ? resolvedConfigurations[0] : { name: applicationName }, remoteNames }; } class FederationDashboardPlugin { _options; _dashData; allArgumentsUsed = []; FederationPluginOptions = {}; constructor(options){ this._options = Object.assign({ debug: false, useAST: false }, options); } apply(compiler) { compiler.options.output.uniqueName = `v${Date.now()}`; new external_add_runtime_requirement_to_promise_external_js_namespaceObject.AddRuntimeRequirementToPromiseExternal().apply(compiler); const FederationPlugin = compiler.options.plugins.find(index_js_namespaceObject.isModuleFederationPlugin); this._options.standalone = void 0 === FederationPlugin; if (FederationPlugin) this.FederationPluginOptions = Object.assign({}, (0, index_js_namespaceObject.extractFederatedConfig)(FederationPlugin), this._options.standalone || {}); else if (this._options.standalone) this.FederationPluginOptions = {}; else throw new Error('Dashboard plugin is missing Module Federation or standalone option'); } processWebpackGraph({ stats, stats_json, pluginOptions }) { const { configurations, graphConfiguration, remoteNames } = resolveFederationGraphConfiguration(pluginOptions.mfConfig, this.FederationPluginOptions, this._options.app?.name); this.FederationPluginOptions = graphConfiguration; const remoteEntryChunk = 1 === configurations.length ? this.getRemoteEntryChunk(stats_json, graphConfiguration) : void 0; const validChunkArray = Array.from(new Set(configurations.flatMap((configuration)=>this.buildValidChunkArray(stats, configuration)))); const chunkDependencies = this.getChunkDependencies(validChunkArray); const vendorFederation = this.buildVendorFederationMap(stats); const getPlatformFromStats = stats.compilation.name; const rawData = { name: graphConfiguration.name, filename: graphConfiguration.filename || '', remotes: remoteNames, metadata: Object.assign({}, this._options.metadata, this.attach_remote_bundle_name_to_metadata(configurations)) || {}, topLevelPackage: vendorFederation || {}, publicPath: stats_json.publicPath, federationRemoteEntry: remoteEntryChunk, buildHash: stats_json.hash, environment: this._options.environment || 'development', version: (0, external_compute_version_strategy_js_namespaceObject.computeVersionStrategy)(stats_json, this._options.versionStrategy), posted: this._options.posted || new Date(), group: this._options.group || 'default', sha: external_compute_version_strategy_js_namespaceObject.gitSha, modules: stats_json.modules, chunkDependencies, functionRemotes: this.allArgumentsUsed, target: pluginOptions.target ?? pluginOptions.zephyr_engine.env.target ?? getPlatformFromStats }; let graphData; try { graphData = (0, convert_to_graph_js_namespaceObject.convertToGraph)(rawData); } catch (err) { console.warn('Error during dashboard data processing'); console.warn(err); } if (!graphData) return; return graphData; } getRemoteEntryChunk(stats, FederationPluginOptions) { if (!stats.chunks) return; return stats.chunks.find((chunk)=>chunk.names?.find((name)=>name === FederationPluginOptions.name)); } getChunkDependencies(validChunkArray) { return validChunkArray.reduce((acc, chunk)=>{ const subset = chunk.getAllReferencedChunks(); const stringifiableChunk = Array.from(subset).map((sub)=>{ const cleanSet = Object.getOwnPropertyNames(sub).reduce((acc, key)=>{ if ('_groups' === key) return acc; return Object.assign(acc, { [key]: sub[key] }); }, {}); return this.mapToObjectRec(cleanSet); }); return Object.assign(acc, { [`${chunk.id}`]: stringifiableChunk }); }, {}); } buildVendorFederationMap(liveStats) { const vendorFederation = {}; let packageJson; if (this._options.packageJsonPath) try { packageJson = require(this._options.packageJsonPath); } catch (error) { console.warn(`Unable to read package JSON at ${this._options.packageJsonPath}: ${String(error)}`); } else { const initialPath = liveStats.compilation.options.context?.split(external_node_path_namespaceObject.sep); packageJson = (0, external_find_package_json_js_namespaceObject.findPackageJson)(initialPath); } if (packageJson) { const resolveFrom = this._options.packageJsonPath ? (0, external_node_path_namespaceObject.dirname)(this._options.packageJsonPath) : liveStats.compilation.options.context ?? process.cwd(); const projectRequire = createProjectRequire((0, external_node_path_namespaceObject.resolve)(resolveFrom, 'package.json')); const resolveVersion = (packageName)=>(0, external_find_package_json_js_namespaceObject.resolveInstalledPackageVersion)(packageName, projectRequire); vendorFederation.dependencies = (0, external_find_package_json_js_namespaceObject.buildVersionedDependencyMap)(packageJson, 'dependencies', resolveVersion); vendorFederation.devDependencies = (0, external_find_package_json_js_namespaceObject.buildVersionedDependencyMap)(packageJson, 'devDependencies', resolveVersion); vendorFederation.optionalDependencies = (0, external_find_package_json_js_namespaceObject.buildVersionedDependencyMap)(packageJson, 'optionalDependencies', resolveVersion); } return vendorFederation; } mapToObjectRec(m) { const lo = {}; for (const [key, value] of Object.entries(m))if (value instanceof Map && value.size > 0) lo[key] = this.mapToObjectRec(value); else if (value instanceof Set && value.size > 0) lo[key] = this.mapToObjectRec(Array.from(value)); else lo[key] = value; return lo; } buildValidChunkArray(liveStats, FederationPluginOptions) { if (!FederationPluginOptions.name) return []; const namedChunkRefs = liveStats.compilation.namedChunks.get(FederationPluginOptions.name); if (!namedChunkRefs) return []; const AllReferencedChunksByRemote = namedChunkRefs.getAllReferencedChunks(); const validChunkArray = []; for (const chunk of AllReferencedChunksByRemote)if (chunk.id !== FederationPluginOptions.name) validChunkArray.push(chunk); return validChunkArray; } attach_remote_bundle_name_to_metadata(configurations = [ this.FederationPluginOptions ]) { if (1 !== configurations.length) return; const [configuration] = configurations; if (!configuration?.exposes) return; if (!configuration.bundle_name) return void console.warn(external_zephyr_agent_namespaceObject.ZeErrors.ERR_MF_CONFIG_MISSING_FILENAME); return { remote_bundle_name: configuration.bundle_name }; } async postDashboardData() {} } })(); exports.FederationDashboardPlugin = __webpack_exports__.FederationDashboardPlugin; exports.resolveFederationGraphConfiguration = __webpack_exports__.resolveFederationGraphConfiguration; for(var __rspack_i in __webpack_exports__)if (-1 === [ "FederationDashboardPlugin", "resolveFederationGraphConfiguration" ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i]; Object.defineProperty(exports, '__esModule', { value: true }); //# sourceMappingURL=FederationDashboardPlugin.js.map