UNPKG

piral-cli

Version:

The standard CLI for creating and building a Piral instance or a Pilet.

72 lines (62 loc) 1.99 kB
import { stat } from 'fs'; import { resolve } from 'path'; import { checkExists } from '../common'; import { PiletRuleContext } from '../types'; export type Options = number; async function getPiletMainPath(main: string, baseDir: string) { const paths = [main, `dist/${main}`, `${main}/index.js`, `dist/${main}/index.js`, 'index.js', 'dist/index.js']; for (const path of paths) { const filePath = resolve(baseDir, path); const exists = await checkExists(filePath); if (exists) { return filePath; } } return undefined; } function getFileSizeInKB(path: string) { return new Promise<number>((resolve, reject) => { stat(path, (err, stats) => { if (err) { reject(err); } else if (stats.isFile()) { // convert from bytes to kB resolve(stats.size / 1024); } else { reject(new Error('The given path is invalid. It must lead to a valid file')); } }); }); } /** * Checks if the main bundle of the pilet is not exceeding a given threshold. * The pilet must have been built beforehand for this validation to be conclusive. * * Negative values yield a warning if the absolute size in kB is exceeded. * * Positive values yield an error if the absolute size in kB is exceeded. * * A value of 0 turns this validation off. * * By default, a pilet's main bundle exceeding 50 kB will result in a warning. */ export default async function (context: PiletRuleContext, options: Options = -50) { if (options !== 0 && typeof options === 'number') { const maxSize = Math.abs(options); const { main } = context.piletPackage; const path = await getPiletMainPath(main, context.root); if (path) { const size = await getFileSizeInKB(path); if (size > maxSize) { const notify = options > 0 ? context.error : context.warning; notify( ` The main bundle is too large. Maximum: ${maxSize} kB. Received: ${size} kB. `, ); } } } }