UNPKG

next

Version:

The React Framework

112 lines (111 loc) 3.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // 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/script', '/next/script.js' ], [ 'next/dynamic', '/next/dynamic.js' ], ]); // 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', ]; 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 featureName1 of FEATURE_MODULE_MAP.keys()){ this.usageTracker.set(featureName1, { featureName: featureName1, 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); this.usageTracker.get(feature).invocationCount = originModules.size; } modulesFinish(); }); callback(); }); } usages() { return [ ...this.usageTracker.values() ]; } } exports.TelemetryPlugin = TelemetryPlugin; /** * Determine if there is a feature of interest in the specified 'module'. */ function findFeatureInModule(module) { if (module.type !== 'javascript/auto') { return; } for (const [feature, path] of FEATURE_MODULE_MAP){ if (module.identifier().replace(/\\/g, '/').endsWith(path)) { 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) { const originModules = new Set(); for (const connection of connections){ if (!originModules.has(connection.originModule)) { originModules.add(connection.originModule); } } return originModules; } //# sourceMappingURL=telemetry-plugin.js.map