@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
JavaScript
;
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