in repo-scripts/size-analysis/analysis-helper.ts [71:171]
export async function extractDependenciesAndSize(
exportName: string,
jsBundle: string
): Promise<ExportData> {
const input = tmp.fileSync().name + '.js';
const externalDepsResolvedOutput = tmp.fileSync().name + '.js';
const externalDepsNotResolvedOutput = tmp.fileSync().name + '.js';
const exportStatement = `export { ${exportName} } from '${path.resolve(
jsBundle
)}';`;
fs.writeFileSync(input, exportStatement);
// Run Rollup on the JavaScript above to produce a tree-shaken build
const externalDepsResolvedBundle = await rollup.rollup({
input,
plugins: [
resolve({
mainFields: ['esm2017', 'module', 'main']
}),
commonjs()
]
});
await externalDepsResolvedBundle.write({
file: externalDepsResolvedOutput,
format: 'es'
});
const externalDepsNotResolvedBundle = await rollup.rollup({
input,
// exclude all firebase dependencies and tslib
external: id => id.startsWith('@firebase') || id === 'tslib'
});
await externalDepsNotResolvedBundle.write({
file: externalDepsNotResolvedOutput,
format: 'es'
});
const dependencies: MemberList = extractAllTopLevelSymbols(
externalDepsNotResolvedOutput
);
const externalDepsResolvedOutputContent = fs.readFileSync(
externalDepsResolvedOutput,
'utf-8'
);
// Extract size of minified build
const externalDepsNotResolvedOutputContent = fs.readFileSync(
externalDepsNotResolvedOutput,
'utf-8'
);
const externalDepsResolvedOutputContentMinimized = await terser.minify(
externalDepsResolvedOutputContent,
{
format: {
comments: false
},
mangle: { toplevel: true },
compress: false
}
);
const externalDepsNotResolvedOutputContentMinimized = await terser.minify(
externalDepsNotResolvedOutputContent,
{
format: {
comments: false
},
mangle: { toplevel: true },
compress: false
}
);
const exportData: ExportData = {
name: '',
classes: [],
functions: [],
variables: [],
enums: [],
unknown: [],
externals: {},
size: 0,
sizeWithExtDeps: 0
};
exportData.name = exportName;
for (const key of Object.keys(dependencies) as Array<keyof MemberList>) {
exportData[key] = dependencies[key];
}
exportData.externals = extractExternalDependencies(
externalDepsNotResolvedOutput
);
exportData.size = Buffer.byteLength(
externalDepsNotResolvedOutputContentMinimized.code!,
'utf-8'
);
exportData.sizeWithExtDeps = Buffer.byteLength(
externalDepsResolvedOutputContentMinimized.code!,
'utf-8'
);
fs.unlinkSync(input);
fs.unlinkSync(externalDepsNotResolvedOutput);
fs.unlinkSync(externalDepsResolvedOutput);
return exportData;
}