metro-bundler/src/ModuleGraph: throw on empty asset images

Reviewed By: fkgozali

Differential Revision: D6030788

fbshipit-source-id: 000757096f7af68c077e80829f48d52814752599
This commit is contained in:
Jean Lauliac 2017-10-12 09:46:54 -07:00 committed by Facebook Github Bot
parent 9bb438ed1d
commit 0608332cb9
3 changed files with 23 additions and 6 deletions

View File

@ -0,0 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`transforming JS modules: assets throws on empty images 1`] = `"Image asset \`foo.png\` cannot be an empty file."`;

View File

@ -210,6 +210,14 @@ describe('transforming JS modules:', () => {
}); });
expect(result.details.package).toEqual(pkg); expect(result.details.package).toEqual(pkg);
}); });
describe('assets', () => {
it('throws on empty images', () => {
expect(() =>
transformModule(new Buffer(0), {...options(), filename: 'foo.png'}),
).toThrowErrorMatchingSnapshot();
});
});
}); });
function createTestData() { function createTestData() {

View File

@ -64,7 +64,7 @@ function transformModule(
options: TransformOptions<{+retainLines?: boolean}>, options: TransformOptions<{+retainLines?: boolean}>,
): TransformedSourceFile { ): TransformedSourceFile {
if (ASSET_EXTENSIONS.has(path.extname(options.filename).substr(1))) { if (ASSET_EXTENSIONS.has(path.extname(options.filename).substr(1))) {
return transformAsset(content, options); return transformAsset(content, options.filename);
} }
const code = content.toString('utf8'); const code = content.toString('utf8');
@ -148,11 +148,10 @@ function transformJSON(json, options): TransformedSourceFile {
return {type: 'code', details: result}; return {type: 'code', details: result};
} }
function transformAsset<ExtraOptions: {}>( function transformAsset(
content: Buffer, content: Buffer,
options: TransformOptions<ExtraOptions>, filePath: string,
): TransformedSourceFile { ): TransformedSourceFile {
const filePath = options.filename;
const assetData = AssetPaths.parse(filePath, Platforms.VALID_PLATFORMS); const assetData = AssetPaths.parse(filePath, Platforms.VALID_PLATFORMS);
const contentType = path.extname(filePath).slice(1); const contentType = path.extname(filePath).slice(1);
const details = { const details = {
@ -160,17 +159,24 @@ function transformAsset<ExtraOptions: {}>(
contentBase64: content.toString('base64'), contentBase64: content.toString('base64'),
contentType, contentType,
filePath, filePath,
physicalSize: getAssetSize(contentType, content), physicalSize: getAssetSize(contentType, content, filePath),
platform: assetData.platform, platform: assetData.platform,
scale: assetData.resolution, scale: assetData.resolution,
}; };
return {details, type: 'asset'}; return {details, type: 'asset'};
} }
function getAssetSize(type: string, content: Buffer): ?ImageSize { function getAssetSize(
type: string,
content: Buffer,
filePath: string,
): ?ImageSize {
if (!isAssetTypeAnImage(type)) { if (!isAssetTypeAnImage(type)) {
return null; return null;
} }
if (content.length === 0) {
throw new Error(`Image asset \`${filePath}\` cannot be an empty file.`);
}
const {width, height} = getImageSize(content); const {width, height} = getImageSize(content);
return {width, height}; return {width, height};
} }