mirror of https://github.com/status-im/metro.git
packager: buck worker: better types
Reviewed By: davidaurelio Differential Revision: D4970025 fbshipit-source-id: 77db309befebe539d25bd8df1039e2304176ca3f
This commit is contained in:
parent
873e2fa25e
commit
655806afe3
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|};
|
|};
|
||||||
|
|
|
@ -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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue