173 lines
5.4 KiB
JavaScript
173 lines
5.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
Object.defineProperty(exports, "TelemetryPlugin", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return TelemetryPlugin;
|
|
}
|
|
});
|
|
const _webpack = require("next/dist/compiled/webpack/webpack");
|
|
// Map of a feature module to the file it belongs in the next package.
|
|
const FEATURE_MODULE_MAP = new Map([
|
|
[
|
|
"next/image",
|
|
"/next/image.js"
|
|
],
|
|
[
|
|
"next/future/image",
|
|
"/next/future/image.js"
|
|
],
|
|
[
|
|
"next/legacy/image",
|
|
"/next/legacy/image.js"
|
|
],
|
|
[
|
|
"next/script",
|
|
"/next/script.js"
|
|
],
|
|
[
|
|
"next/dynamic",
|
|
"/next/dynamic.js"
|
|
]
|
|
]);
|
|
const FEATURE_MODULE_REGEXP_MAP = new Map([
|
|
[
|
|
"@next/font/google",
|
|
/\/@next\/font\/google\/target.css?.+$/
|
|
],
|
|
[
|
|
"@next/font/local",
|
|
/\/@next\/font\/local\/target.css?.+$/
|
|
],
|
|
[
|
|
"next/font/google",
|
|
/\/next\/font\/google\/target.css?.+$/
|
|
],
|
|
[
|
|
"next/font/local",
|
|
/\/next\/font\/local\/target.css?.+$/
|
|
]
|
|
]);
|
|
// List of build features used in webpack configuration
|
|
const BUILD_FEATURES = [
|
|
"swcLoader",
|
|
"swcMinify",
|
|
"swcRelay",
|
|
"swcStyledComponents",
|
|
"swcReactRemoveProperties",
|
|
"swcExperimentalDecorators",
|
|
"swcRemoveConsole",
|
|
"swcImportSource",
|
|
"swcEmotion",
|
|
"swc/target/x86_64-apple-darwin",
|
|
"swc/target/x86_64-unknown-linux-gnu",
|
|
"swc/target/x86_64-pc-windows-msvc",
|
|
"swc/target/i686-pc-windows-msvc",
|
|
"swc/target/aarch64-unknown-linux-gnu",
|
|
"swc/target/armv7-unknown-linux-gnueabihf",
|
|
"swc/target/aarch64-apple-darwin",
|
|
"swc/target/aarch64-linux-android",
|
|
"swc/target/arm-linux-androideabi",
|
|
"swc/target/x86_64-unknown-freebsd",
|
|
"swc/target/x86_64-unknown-linux-musl",
|
|
"swc/target/aarch64-unknown-linux-musl",
|
|
"swc/target/aarch64-pc-windows-msvc",
|
|
"turbotrace",
|
|
"transpilePackages",
|
|
"skipMiddlewareUrlNormalize",
|
|
"skipTrailingSlashRedirect",
|
|
"modularizeImports"
|
|
];
|
|
const ELIMINATED_PACKAGES = new Set();
|
|
/**
|
|
* Determine if there is a feature of interest in the specified 'module'.
|
|
*/ function findFeatureInModule(module) {
|
|
if (module.type !== "javascript/auto") {
|
|
return;
|
|
}
|
|
const normalizedIdentifier = module.identifier().replace(/\\/g, "/");
|
|
for (const [feature, path] of FEATURE_MODULE_MAP){
|
|
if (normalizedIdentifier.endsWith(path)) {
|
|
return feature;
|
|
}
|
|
}
|
|
for (const [feature, regexp] of FEATURE_MODULE_REGEXP_MAP){
|
|
if (regexp.test(normalizedIdentifier)) {
|
|
return feature;
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Find unique origin modules in the specified 'connections', which possibly
|
|
* contains more than one connection for a module due to different types of
|
|
* dependency.
|
|
*/ function findUniqueOriginModulesInConnections(connections, originModule) {
|
|
const originModules = new Set();
|
|
for (const connection of connections){
|
|
if (!originModules.has(connection.originModule) && connection.originModule !== originModule) {
|
|
originModules.add(connection.originModule);
|
|
}
|
|
}
|
|
return originModules;
|
|
}
|
|
class TelemetryPlugin {
|
|
// Build feature usage is on/off and is known before the build starts
|
|
constructor(buildFeaturesMap){
|
|
this.usageTracker = new Map();
|
|
for (const featureName of BUILD_FEATURES){
|
|
this.usageTracker.set(featureName, {
|
|
featureName,
|
|
invocationCount: buildFeaturesMap.get(featureName) ? 1 : 0
|
|
});
|
|
}
|
|
for (const featureName of FEATURE_MODULE_MAP.keys()){
|
|
this.usageTracker.set(featureName, {
|
|
featureName,
|
|
invocationCount: 0
|
|
});
|
|
}
|
|
for (const featureName of FEATURE_MODULE_REGEXP_MAP.keys()){
|
|
this.usageTracker.set(featureName, {
|
|
featureName,
|
|
invocationCount: 0
|
|
});
|
|
}
|
|
}
|
|
apply(compiler) {
|
|
compiler.hooks.make.tapAsync(TelemetryPlugin.name, async (compilation, callback)=>{
|
|
compilation.hooks.finishModules.tapAsync(TelemetryPlugin.name, async (modules, modulesFinish)=>{
|
|
for (const module of modules){
|
|
const feature = findFeatureInModule(module);
|
|
if (!feature) {
|
|
continue;
|
|
}
|
|
const connections = compilation.moduleGraph.getIncomingConnections(module);
|
|
const originModules = findUniqueOriginModulesInConnections(connections, module);
|
|
this.usageTracker.get(feature).invocationCount = originModules.size;
|
|
}
|
|
modulesFinish();
|
|
});
|
|
callback();
|
|
});
|
|
if (compiler.options.mode === "production" && !compiler.watchMode) {
|
|
compiler.hooks.compilation.tap(TelemetryPlugin.name, (compilation)=>{
|
|
const moduleHooks = _webpack.NormalModule.getCompilationHooks(compilation);
|
|
moduleHooks.loader.tap(TelemetryPlugin.name, (loaderContext)=>{
|
|
loaderContext.eliminatedPackages = ELIMINATED_PACKAGES;
|
|
});
|
|
});
|
|
}
|
|
}
|
|
usages() {
|
|
return [
|
|
...this.usageTracker.values()
|
|
];
|
|
}
|
|
packagesUsedInServerSideProps() {
|
|
return Array.from(ELIMINATED_PACKAGES);
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=telemetry-plugin.js.map
|