packager: buck worker: better types

Reviewed By: davidaurelio

Differential Revision: D4970025

fbshipit-source-id: 77db309befebe539d25bd8df1039e2304176ca3f
This commit is contained in:
Jean Lauliac 2017-05-02 03:41:39 -07:00 committed by Facebook Github Bot
parent 873e2fa25e
commit 655806afe3
8 changed files with 72 additions and 50 deletions

View File

@ -12,7 +12,7 @@
'use strict'; 'use strict';
import type {CachedReadResult, ReadResult} from '../../node-haste/Module'; import type {CachedReadResult, ReadResult} from '../../node-haste/Module';
import type {TransformedFile} from '../types.flow'; import type {TransformedCodeFile} from '../types.flow';
import type {ModuleCache} from './node-haste.flow'; import type {ModuleCache} from './node-haste.flow';
module.exports = class Module { module.exports = class Module {
@ -25,7 +25,7 @@ module.exports = class Module {
constructor( constructor(
path: string, path: string,
moduleCache: ModuleCache, moduleCache: ModuleCache,
info: TransformedFile, info: TransformedCodeFile,
) { ) {
this.hasteID = Promise.resolve(info.hasteID); this.hasteID = Promise.resolve(info.hasteID);
this.moduleCache = moduleCache; this.moduleCache = moduleCache;

View File

@ -14,19 +14,19 @@
const Module = require('./Module'); const Module = require('./Module');
const Package = require('./Package'); const Package = require('./Package');
import type {PackageData, TransformedFile} from '../types.flow'; import type {PackageData, TransformedCodeFile} from '../types.flow';
type GetClosestPackageFn = (filePath: string) => ?string; type GetClosestPackageFn = (filePath: string) => ?string;
module.exports = class ModuleCache { module.exports = class ModuleCache {
_getClosestPackage: GetClosestPackageFn; _getClosestPackage: GetClosestPackageFn;
getTransformedFile: string => TransformedFile; getTransformedFile: string => TransformedCodeFile;
modules: Map<string, Module>; modules: Map<string, Module>;
packages: Map<string, Package>; packages: Map<string, Package>;
constructor( constructor(
getClosestPackage: GetClosestPackageFn, getClosestPackage: GetClosestPackageFn,
getTransformedFile: string => TransformedFile, getTransformedFile: string => TransformedCodeFile,
) { ) {
this._getClosestPackage = getClosestPackage; this._getClosestPackage = getClosestPackage;
this.getTransformedFile = getTransformedFile; this.getTransformedFile = getTransformedFile;

View File

@ -18,7 +18,7 @@ import type { // eslint-disable-line sort-requires
import type { import type {
ResolveFn, ResolveFn,
TransformedFile, TransformedCodeFile,
} from '../types.flow'; } from '../types.flow';
const DependencyGraphHelpers = require('../../node-haste/DependencyGraph/DependencyGraphHelpers'); const DependencyGraphHelpers = require('../../node-haste/DependencyGraph/DependencyGraphHelpers');
@ -34,7 +34,7 @@ const defaults = require('../../../defaults');
type ResolveOptions = {| type ResolveOptions = {|
assetExts: Extensions, assetExts: Extensions,
extraNodeModules: {[id: string]: string}, extraNodeModules: {[id: string]: string},
transformedFiles: {[path: Path]: TransformedFile}, transformedFiles: {[path: Path]: TransformedCodeFile},
|}; |};
const platforms = new Set(defaults.platforms); const platforms = new Set(defaults.platforms);

View File

@ -27,10 +27,10 @@ export type File = {|
code: string, code: string,
map?: ?Object, map?: ?Object,
path: string, path: string,
type: FileTypes, type: CodeFileTypes,
|}; |};
type FileTypes = 'module' | 'script' | 'asset'; type CodeFileTypes = 'module' | 'script';
export type GraphFn = ( export type GraphFn = (
entryPoints: Iterable<string>, entryPoints: Iterable<string>,
@ -125,16 +125,31 @@ export type TransformResults = {[string]: TransformResult};
export type TransformVariants = {[key: string]: Object}; export type TransformVariants = {[key: string]: Object};
export type TransformedFile = { export type TransformedCodeFile = {
assetContent: ?string, +code: string,
code: string, +file: string,
file: string, +hasteID: ?string,
hasteID: ?string,
package?: PackageData, package?: PackageData,
transformed: TransformResults, +transformed: TransformResults,
type: FileTypes, +type: CodeFileTypes,
}; };
export type AssetFile = {|
+assetContentBase64: string,
+filePath: string,
|};
export type TransformedSourceFile =
| {|
+type: 'code',
+details: TransformedCodeFile,
|}
| {|
+type: 'asset',
+details: AssetFile,
|}
;
export type LibraryOptions = {| export type LibraryOptions = {|
dependencies?: Array<string>, dependencies?: Array<string>,
platform?: string, platform?: string,
@ -145,7 +160,7 @@ export type Base64Content = string;
export type AssetContentsByPath = {[destFilePath: string]: Base64Content}; export type AssetContentsByPath = {[destFilePath: string]: Base64Content};
export type Library = {| export type Library = {|
files: Array<TransformedFile>, +files: Array<TransformedCodeFile>,
/* cannot be a Map because it's JSONified later on */ /* cannot be a Map because it's JSONified later on */
assets: AssetContentsByPath, +assets: AssetContentsByPath,
|}; |};

View File

@ -36,7 +36,7 @@ describe('optimizing JS modules', () => {
if (error) { if (error) {
throw error; throw error;
} }
transformResult = JSON.stringify(result); transformResult = JSON.stringify(result.details);
done(); done();
}); });
}); });

View File

@ -45,7 +45,8 @@ describe('transforming JS modules:', () => {
it('passes through file name and code', done => { it('passes through file name and code', done => {
transformModule(sourceCode, options(), (error, result) => { transformModule(sourceCode, options(), (error, result) => {
expect(result).toEqual(expect.objectContaining({ expect(result.type).toBe('code');
expect(result.details).toEqual(expect.objectContaining({
code: sourceCode, code: sourceCode,
file: filename, file: filename,
})); }));
@ -57,21 +58,24 @@ describe('transforming JS modules:', () => {
const hasteID = 'TheModule'; const hasteID = 'TheModule';
const codeWithHasteID = `/** @providesModule ${hasteID} */`; const codeWithHasteID = `/** @providesModule ${hasteID} */`;
transformModule(codeWithHasteID, options(), (error, result) => { transformModule(codeWithHasteID, options(), (error, result) => {
expect(result).toEqual(expect.objectContaining({hasteID})); expect(result.type).toBe('code');
expect(result.details).toEqual(expect.objectContaining({hasteID}));
done(); done();
}); });
}); });
it('sets `type` to `"module"` by default', done => { it('sets `type` to `"module"` by default', done => {
transformModule(sourceCode, options(), (error, result) => { transformModule(sourceCode, options(), (error, result) => {
expect(result).toEqual(expect.objectContaining({type: 'module'})); expect(result.type).toBe('code');
expect(result.details).toEqual(expect.objectContaining({type: 'module'}));
done(); done();
}); });
}); });
it('sets `type` to `"script"` if the input is a polyfill', done => { it('sets `type` to `"script"` if the input is a polyfill', done => {
transformModule(sourceCode, {...options(), polyfill: true}, (error, result) => { transformModule(sourceCode, {...options(), polyfill: true}, (error, result) => {
expect(result).toEqual(expect.objectContaining({type: 'script'})); expect(result.type).toBe('code');
expect(result.details).toEqual(expect.objectContaining({type: 'script'}));
done(); done();
}); });
}); });
@ -105,7 +109,7 @@ describe('transforming JS modules:', () => {
transformModule(sourceCode, options(), (error, result) => { transformModule(sourceCode, options(), (error, result) => {
expect(error).toEqual(null); expect(error).toEqual(null);
const {code, dependencyMapName} = result.transformed.default; const {code, dependencyMapName} = result.details.transformed.default;
expect(code.replace(/\s+/g, '')) expect(code.replace(/\s+/g, ''))
.toEqual( .toEqual(
`__d(function(global,require,module,exports,${ `__d(function(global,require,module,exports,${
@ -119,7 +123,7 @@ describe('transforming JS modules:', () => {
transformModule(sourceCode, {...options(), polyfill: true}, (error, result) => { transformModule(sourceCode, {...options(), polyfill: true}, (error, result) => {
expect(error).toEqual(null); expect(error).toEqual(null);
const {code} = result.transformed.default; const {code} = result.details.transformed.default;
expect(code.replace(/\s+/g, '')) expect(code.replace(/\s+/g, ''))
.toEqual(`(function(global){${transformedCode}})(this);`); .toEqual(`(function(global){${transformedCode}})(this);`);
done(); done();
@ -128,7 +132,7 @@ describe('transforming JS modules:', () => {
it('creates source maps', done => { it('creates source maps', done => {
transformModule(sourceCode, options(), (error, result) => { transformModule(sourceCode, options(), (error, result) => {
const {code, map} = result.transformed.default; const {code, map} = result.details.transformed.default;
const column = code.indexOf('code'); const column = code.indexOf('code');
const consumer = new SourceMapConsumer(map); const consumer = new SourceMapConsumer(map);
expect(consumer.originalPositionFor({line: 1, column})) expect(consumer.originalPositionFor({line: 1, column}))
@ -145,7 +149,7 @@ describe('transforming JS modules:', () => {
transformer.transform.stub.returns(transformResult(body)); transformer.transform.stub.returns(transformResult(body));
transformModule(code, options(), (error, result) => { transformModule(code, options(), (error, result) => {
expect(result.transformed.default) expect(result.details.transformed.default)
.toEqual(expect.objectContaining({dependencies: [dep1, dep2]})); .toEqual(expect.objectContaining({dependencies: [dep1, dep2]}));
done(); done();
}); });
@ -160,7 +164,7 @@ describe('transforming JS modules:', () => {
.returns(transformResult([])); .returns(transformResult([]));
transformModule(sourceCode, options(variants), (error, result) => { transformModule(sourceCode, options(variants), (error, result) => {
const {dev, prod} = result.transformed; const {dev, prod} = result.details.transformed;
expect(dev.code.replace(/\s+/g, '')) expect(dev.code.replace(/\s+/g, ''))
.toEqual( .toEqual(
`__d(function(global,require,module,exports,${ `__d(function(global,require,module,exports,${
@ -179,7 +183,7 @@ describe('transforming JS modules:', () => {
const json = '{"foo":"bar"}'; const json = '{"foo":"bar"}';
transformModule(json, {...options(), filename: 'some.json'}, (error, result) => { transformModule(json, {...options(), filename: 'some.json'}, (error, result) => {
const {code} = result.transformed.default; const {code} = result.details.transformed.default;
expect(code.replace(/\s+/g, '')) expect(code.replace(/\s+/g, ''))
.toEqual( .toEqual(
'__d(function(global,require,module,exports){' + '__d(function(global,require,module,exports){' +
@ -191,7 +195,7 @@ describe('transforming JS modules:', () => {
it('does not create source maps for JSON files', done => { it('does not create source maps for JSON files', done => {
transformModule('{}', {...options(), filename: 'some.json'}, (error, result) => { transformModule('{}', {...options(), filename: 'some.json'}, (error, result) => {
expect(result.transformed.default) expect(result.details.transformed.default)
.toEqual(expect.objectContaining({map: null})); .toEqual(expect.objectContaining({map: null}));
done(); done();
}); });
@ -209,7 +213,7 @@ describe('transforming JS modules:', () => {
JSON.stringify(pkg), JSON.stringify(pkg),
{...options(), filename: 'arbitrary/package.json'}, {...options(), filename: 'arbitrary/package.json'},
(error, result) => { (error, result) => {
expect(result.package).toEqual(pkg); expect(result.details.package).toEqual(pkg);
done(); done();
}, },
); );

View File

@ -18,7 +18,7 @@ const inline = require('../../JSTransformer/worker/inline').plugin;
const minify = require('../../JSTransformer/worker/minify'); const minify = require('../../JSTransformer/worker/minify');
const sourceMap = require('source-map'); const sourceMap = require('source-map');
import type {TransformedFile, TransformResult} from '../types.flow'; import type {TransformedCodeFile, TransformResult} from '../types.flow';
export type OptimizationOptions = {| export type OptimizationOptions = {|
dev: boolean, dev: boolean,
@ -27,9 +27,9 @@ export type OptimizationOptions = {|
|}; |};
function optimizeModule( function optimizeModule(
data: string | TransformedFile, data: string | TransformedCodeFile,
optimizationOptions: OptimizationOptions, optimizationOptions: OptimizationOptions,
): TransformedFile { ): TransformedCodeFile {
if (typeof data === 'string') { if (typeof data === 'string') {
data = JSON.parse(data); data = JSON.parse(data);
} }

View File

@ -20,7 +20,8 @@ const {basename} = require('path');
import type { import type {
Callback, Callback,
TransformedFile, TransformedCodeFile,
TransformedSourceFile,
Transformer, Transformer,
TransformerResult, TransformerResult,
TransformResult, TransformResult,
@ -41,7 +42,7 @@ const polyfillFactoryParameters = ['global'];
function transformModule( function transformModule(
content: Buffer, content: Buffer,
options: TransformOptions, options: TransformOptions,
callback: Callback<TransformedFile>, callback: Callback<TransformedSourceFile>,
): void { ): void {
if (options.filename.endsWith('.png')) { if (options.filename.endsWith('.png')) {
transformAsset(content, options, callback); transformAsset(content, options, callback);
@ -86,12 +87,15 @@ function transformModule(
const annotations = docblock.parseAsObject(docblock.extract(code)); const annotations = docblock.parseAsObject(docblock.extract(code));
callback(null, { callback(null, {
assetContent: null, type: 'code',
code, details: {
file: filename, assetContent: null,
hasteID: annotations.providesModule || null, code,
transformed, file: filename,
type: options.polyfill ? 'script' : 'module', hasteID: annotations.providesModule || null,
transformed,
type: options.polyfill ? 'script' : 'module',
},
}); });
}); });
return; return;
@ -116,7 +120,7 @@ function transformJSON(json, options, callback) {
.keys(options.variants || defaultVariants) .keys(options.variants || defaultVariants)
.forEach(key => (transformed[key] = moduleData)); .forEach(key => (transformed[key] = moduleData));
const result: TransformedFile = { const result: TransformedCodeFile = {
assetContent: null, assetContent: null,
code: json, code: json,
file: filename, file: filename,
@ -133,20 +137,19 @@ function transformJSON(json, options, callback) {
'react-native': value['react-native'], 'react-native': value['react-native'],
}; };
} }
callback(null, result); callback(null, {type: 'code', details: result});
} }
function transformAsset( function transformAsset(
content: Buffer, content: Buffer,
options: TransformOptions, options: TransformOptions,
callback: Callback<TransformedFile>, callback: Callback<TransformedSourceFile>,
) { ) {
callback(null, { callback(null, {
assetContent: content.toString('base64'), details: {
code: '', assetContentBase64: content.toString('base64'),
file: options.filename, filePath: options.filename,
hasteID: null, },
transformed: {},
type: 'asset', type: 'asset',
}); });
} }