UNPKG

@atlassian/webresource-webpack-plugin

Version:

Auto-generates web-resource definitions from your webpacked code, for usage in an Atlassian product or plugin.

154 lines 7.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractLibraryDetailsFromWebpackConfig = exports.isSingleRuntime = exports.isRunningInProductionMode = exports.getAllAssetFiles = exports.getExternalResourcesForChunks = exports.getResourcesForChunks = exports.getDependencyForCompiledCss = exports.getDependenciesForChunks = exports.getChunkModules = exports.getAllAsyncChunks = void 0; const uniq_1 = __importDefault(require("lodash/uniq")); const compiled_css_1 = require("./helpers/compiled-css"); const getAllAsyncChunks = (entryPoints) => { const seenAsyncChunks = new Set(); const recursivelyGetAllAsyncChunks = (chunk) => { const asyncChunks = [...(chunk.getAllAsyncChunks() || [])]; const unseen = asyncChunks.filter((ac) => { if (seenAsyncChunks.has(ac)) { return false; } seenAsyncChunks.add(ac); return true; }); return [...unseen, ...unseen.flatMap((ac) => recursivelyGetAllAsyncChunks(ac))]; }; return entryPoints.flatMap((ep) => { return recursivelyGetAllAsyncChunks(ep.getEntrypointChunk()); }); }; exports.getAllAsyncChunks = getAllAsyncChunks; const getChunkModules = (compilation, chunk) => { return compilation.chunkGraph.getChunkModules(chunk).flatMap((module) => { // unwind concatenated modules if ('modules' in module && module.modules && Array.isArray(module.modules)) { return [module, ...module.modules]; } return module; }); }; exports.getChunkModules = getChunkModules; const getDependenciesForChunks = (compilation, val, dependencyModuleMap, providedDependencies) => { const chunks = Array.isArray(val) ? val : [val]; const externalDeps = new Set(); for (const chunk of chunks) { for (const module of (0, exports.getChunkModules)(compilation, chunk)) { if (module.constructor.name === 'ExternalModule') { const providedDependency = providedDependencies.get(module.userRequest); if (providedDependency) { externalDeps.add(providedDependency.dependency); } } const moduleKey = module.identifier(); const dependenciesForModule = [...(dependencyModuleMap.get(moduleKey) || [])]; for (const dep of dependenciesForModule) { externalDeps.add(dep); } } // TODO: figure out how to pass this "properly" as a module // @ts-expect-error See WrmPlugin.ts where this is set. if (chunk.needsWrmRequire) { externalDeps.add('com.atlassian.plugins.atlassian-plugins-webresource-rest:web-resource-manager'); } } return Array.from(externalDeps); }; exports.getDependenciesForChunks = getDependenciesForChunks; const getDependencyForCompiledCss = (compilation, chunk, pluginKey) => { const modules = (0, exports.getChunkModules)(compilation, chunk); const looksLikeCompiledCss = (0, compiled_css_1.chunkLooksLikeCompiledCss)(chunk); const hasCompiledCss = modules .filter((m) => m.constructor.name === 'NormalModule') .some((m) => { const request = m.request; // we're overly broad here to avoid unexpected internal changes in compiled-css causing us to miss the dependency return request.includes(compiled_css_1.COMPILED_CSS_SCOPE) || request.endsWith(compiled_css_1.COMPILED_CSS_FILENAME); }); return !looksLikeCompiledCss && hasCompiledCss ? [`${pluginKey}:compiled-css`] : []; }; exports.getDependencyForCompiledCss = getDependencyForCompiledCss; const getResourcesForChunks = (compilation, chunks, auxiliaryChunks, resourceAssetsMap) => { const resourceList = []; for (const chunk of chunks) { resourceList.push(...Array.from(chunk.files)); } for (const chunk of auxiliaryChunks) { resourceList.push(...Array.from(chunk.auxiliaryFiles)); } const allAssetFiles = (0, exports.getAllAssetFiles)(compilation); const resourceAssets = resourceList.flatMap((resource) => { return Array.from(resourceAssetsMap.get(resource) || []).filter((assetFile) => allAssetFiles.includes(assetFile)); }); resourceList.push(...resourceAssets); return (0, uniq_1.default)(resourceList); }; exports.getResourcesForChunks = getResourcesForChunks; const getExternalResourcesForChunks = (compilation, val, resourceModuleMap) => { const chunks = Array.isArray(val) ? val : [val]; // Use a Map keyed by name+location to deduplicate by value, not by // object reference. A plain Set would keep duplicate {name, location} // pairs that came from different module instances in the same chunk. const deduped = new Map(); for (const chunk of chunks) { for (const module of (0, exports.getChunkModules)(compilation, chunk)) { const moduleKey = module.identifier(); const resourcesForModule = [...(resourceModuleMap.get(moduleKey) || [])]; for (const resource of resourcesForModule) { const key = JSON.stringify(resource); if (!deduped.has(key)) { deduped.set(key, resource); } } } } return Array.from(deduped.values()); }; exports.getExternalResourcesForChunks = getExternalResourcesForChunks; const getAllAssetFiles = (compilation) => { // remove anything that we know is handled differently return Object.keys(compilation.assets).filter((p) => !/\.(js|css|soy)(\.map)?$/.test(p)); }; exports.getAllAssetFiles = getAllAssetFiles; const isRunningInProductionMode = (compiler) => { const { mode } = compiler.options; return mode === 'production' || (mode === 'none' && process.env.NODE_ENV === 'production'); }; exports.isRunningInProductionMode = isRunningInProductionMode; const isSingleRuntime = (compiler) => { const { options } = compiler; const runtimeChunkCfg = options.optimization && options.optimization.runtimeChunk; if (runtimeChunkCfg) { if (typeof runtimeChunkCfg === 'string') { return runtimeChunkCfg === 'single'; } const { name } = runtimeChunkCfg; if (typeof name === 'string') { return true; } if (typeof name === 'function') { const resultA = name({ name: 'foo' }); const resultB = name({ name: 'bar' }); return resultA === resultB; } } return false; }; exports.isSingleRuntime = isSingleRuntime; const extractLibraryDetailsFromWebpackConfig = (compiler) => { const { library } = compiler.options.output; if (!library) { return { target: compiler.options.externalsType, name: undefined }; } return { target: library.type, name: library.name, }; }; exports.extractLibraryDetailsFromWebpackConfig = extractLibraryDetailsFromWebpackConfig; //# sourceMappingURL=WebpackHelpers.js.map