Skip to content

Commit

Permalink
Create metro-transform-worker package
Browse files Browse the repository at this point in the history
Summary:
This diff brings all the worker related functionality into a new package to separate concerns.

Note: `ModuleGraph` also needs to be split out of `metro` at some point to get rid of the circular dependency. This is not a problem given that we lock all `metro-*` packages to the same exact version but definitely not ideal. I will follow-up but it isn't blocking me.

Reviewed By: motiz88

Differential Revision: D21014084

fbshipit-source-id: e25f099d2cb5427627bc1666d590bd2d29eefb22
  • Loading branch information
cpojer authored and facebook-github-bot committed Apr 17, 2020
1 parent be9deed commit 95ee7bb
Show file tree
Hide file tree
Showing 18 changed files with 78 additions and 53 deletions.
2 changes: 1 addition & 1 deletion packages/metro-config/src/configTypes.flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ import type {IncomingMessage, ServerResponse} from 'http';
import type {CacheStore} from 'metro-cache';
import type {CustomResolver} from 'metro-resolver';
import type {BasicSourceMap, MixedSourceMap} from 'metro-source-map';
import type {JsTransformerConfig} from 'metro-transform-worker';
import type {
DeltaResult,
Graph,
Module,
SerializerOptions,
} from 'metro/src/DeltaBundler/types.flow.js';
import type {TransformResult} from 'metro/src/DeltaBundler';
import type {JsTransformerConfig} from 'metro/src/JSTransformer/worker';
import type {TransformVariants} from 'metro/src/ModuleGraph/types.flow.js';
import type Server from 'metro/src/Server';
import type {Reporter} from 'metro/src/lib/reporting';
Expand Down
2 changes: 1 addition & 1 deletion packages/metro-config/src/defaults/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ const getDefaultValues = (projectRoot: ?string): ConfigT => ({
projectRoot: projectRoot || path.resolve(__dirname, '../../..'),
stickyWorkers: true,
watchFolders: [],
transformerPath: require.resolve('metro/src/JSTransformer/worker.js'),
transformerPath: require.resolve('metro-transform-worker'),
maxWorkers: getMaxWorkers(),
resetCache: false,
reporter: new TerminalReporter(new Terminal(process.stdout)),
Expand Down
5 changes: 1 addition & 4 deletions packages/metro-minify-terser/src/minifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@
const terser = require('terser');

import type {BasicSourceMap} from 'metro-source-map';
import type {
MinifierResult,
MinifierOptions,
} from 'metro/src/shared/types.flow.js';
import type {MinifierResult, MinifierOptions} from 'metro-transform-worker';

function minifier(options: MinifierOptions): MinifierResult {
const result = minify(options);
Expand Down
5 changes: 1 addition & 4 deletions packages/metro-minify-uglify/src/minifier.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@
const uglify = require('uglify-es');

import type {BasicSourceMap} from 'metro-source-map';
import type {
MinifierResult,
MinifierOptions,
} from 'metro/src/shared/types.flow.js';
import type {MinifierResult, MinifierOptions} from 'metro-transform-worker';

function minifier(options: MinifierOptions): MinifierResult {
const result = minify(options);
Expand Down
33 changes: 33 additions & 0 deletions packages/metro-transform-worker/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"name": "metro-transform-worker",
"version": "0.59.0",
"description": "🚇 Transform worker for Metro",
"main": "src/index.js",
"repository": {
"type": "git",
"url": "git@github.com:facebook/metro.git"
},
"scripts": {
"prepare-release": "test -d build && rm -rf src.real && mv src src.real && mv build src",
"cleanup-release": "test ! -e build && mv src build && mv src.real src"
},
"license": "MIT",
"dependencies": {
"@babel/core": "^7.0.0",
"@babel/generator": "^7.5.0",
"@babel/parser": "^7.0.0",
"@babel/types": "^7.0.0",
"babel-preset-fbjs": "^3.3.0",
"metro-babel-transformer": "0.59.0",
"metro-cache": "0.59.0",
"metro-source-map": "0.59.0",
"metro-transform-plugins": "0.59.0",
"metro": "0.59.0"
},
"devDependencies": {
"metro-minify-uglify": "0.59.0",
"metro-memory-fs": "0.59.0",
"mkdirp": "^0.5.1",
"metro-react-native-babel-transformer": "0.59.0"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
'use strict';

jest
.mock('../../lib/getMinifier', () => () => ({code, map}) => ({
.mock('../utils/getMinifier', () => () => ({code, map}) => ({
code: code.replace('arbitrary(code)', 'minified(code)'),
map,
}))
Expand Down Expand Up @@ -58,7 +58,7 @@ describe('code transformation worker:', () => {

fs = require('fs');
mkdirp = require('mkdirp');
Transformer = require('../worker');
Transformer = require('../');
fs.reset();

mkdirp.sync('/root/local');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@

'use strict';

const JsFileWrapping = require('../ModuleGraph/worker/JsFileWrapping');
const JsFileWrapping = require('metro/src/ModuleGraph/worker/JsFileWrapping');

const assetTransformer = require('../assetTransformer');
const assetTransformer = require('./utils/assetTransformer');
const babylon = require('@babel/parser');
const collectDependencies = require('../ModuleGraph/worker/collectDependencies');
const generateImportNames = require('../ModuleGraph/worker/generateImportNames');
const collectDependencies = require('metro/src/ModuleGraph/worker/collectDependencies');
const generateImportNames = require('metro/src/ModuleGraph/worker/generateImportNames');
const generate = require('@babel/generator').default;
const getKeyFromFiles = require('../lib/getKeyFromFiles');
const getMinifier = require('../lib/getMinifier');
const getKeyFromFiles = require('metro/src/lib/getKeyFromFiles');
const getMinifier = require('./utils/getMinifier');
const {
constantFoldingPlugin,
getTransformPluginCacheKeyFiles,
Expand All @@ -30,7 +30,7 @@ const inlineRequiresPlugin = require('babel-preset-fbjs/plugins/inline-requires'
const {transformFromAstSync} = require('@babel/core');
const {stableHash} = require('metro-cache');
const types = require('@babel/types');
const countLines = require('../lib/countLines');
const countLines = require('metro/src/lib/countLines');

const {
fromRawMappings,
Expand All @@ -39,7 +39,7 @@ const {
} = require('metro-source-map');
import type {TransformResultDependency} from 'metro/src/DeltaBundler';
import type {AllowOptionalDependencies} from 'metro/src/DeltaBundler/types.flow.js';
import type {DynamicRequiresBehavior} from '../ModuleGraph/worker/collectDependencies';
import type {DynamicRequiresBehavior} from 'metro/src/ModuleGraph/worker/collectDependencies';
import type {
BasicSourceMap,
FBSourceFunctionMap,
Expand All @@ -57,6 +57,14 @@ export type MinifierOptions = {
...
};

export type MinifierResult = {
code: string,
map?: BasicSourceMap,
...
};

export type Minifier = MinifierOptions => MinifierResult;

export type Type = 'script' | 'module' | 'asset';

export type JsTransformerConfig = $ReadOnly<{|
Expand Down Expand Up @@ -413,12 +421,11 @@ module.exports = {
const filesKey = getKeyFromFiles([
require.resolve(babelTransformerPath),
require.resolve(minifierPath),
require.resolve('../assetTransformer'),
require.resolve('../lib/getMinifier'),
require.resolve('../ModuleGraph/worker/collectDependencies'),
require.resolve('../ModuleGraph/worker/generateImportNames'),
require.resolve('../ModuleGraph/worker/JsFileWrapping'),
require.resolve('../ModuleGraph/worker/optimizeDependencies'),
require.resolve('./utils/getMinifier'),
require.resolve('./utils/assetTransformer'),
require.resolve('metro/src/ModuleGraph/worker/collectDependencies'),
require.resolve('metro/src/ModuleGraph/worker/generateImportNames'),
require.resolve('metro/src/ModuleGraph/worker/JsFileWrapping'),
...getTransformPluginCacheKeyFiles(),
]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@

const path = require('path');

const {getAssetData} = require('./Assets');
const {generateAssetCodeFileAst} = require('./Bundler/util');
const {getAssetData} = require('metro/src/Assets');
const {generateAssetCodeFileAst} = require('metro/src/Bundler/util');

import type {Ast} from '@babel/core';
import type {BabelTransformerArgs} from 'metro-babel-transformer';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@

'use strict';

import type {MetroMinifier} from '../shared/types.flow.js';
import type {Minifier} from '../index.js';

function getMinifier(minifierPath: string): MetroMinifier {
function getMinifier(minifierPath: string): Minifier {
// Note: minifierPath should be an absolute path OR a module name here!
// The options allow relative paths but they HAVE to be normalized at
// any entry point that accepts them...
Expand Down
2 changes: 1 addition & 1 deletion packages/metro/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
"@babel/types": "^7.0.0",
"absolute-path": "^0.0.0",
"async": "^2.4.0",
"babel-preset-fbjs": "^3.3.0",
"buffer-crc32": "^0.2.13",
"chalk": "^2.4.1",
"ci-info": "^2.0.0",
Expand Down Expand Up @@ -55,6 +54,7 @@
"metro-source-map": "0.59.0",
"metro-symbolicate": "0.59.0",
"metro-transform-plugins": "0.59.0",
"metro-transform-worker": "0.59.0",
"mime-types": "2.1.11",
"mkdirp": "^0.5.1",
"node-fetch": "^2.2.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/metro/src/DeltaBundler/Serializers/helpers/js.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ const addParamsToDefineCall = require('../../../lib/addParamsToDefineCall');
const invariant = require('invariant');
const path = require('path');

import type {JsOutput} from '../../../JSTransformer/worker';
import type {MixedOutput, Module, Dependency} from '../../types.flow';
import type {JsOutput} from 'metro-transform-worker';

export type Options = {
+createModuleId: string => number | string,
Expand Down
8 changes: 4 additions & 4 deletions packages/metro/src/DeltaBundler/Worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ const crypto = require('crypto');
const fs = require('fs');
const path = require('path');

import type {TransformResult} from './types.flow';
import type {LogEntry} from 'metro-core/src/Logger';
import type {
JsTransformOptions,
JsTransformerConfig,
} from '../JSTransformer/worker';
import type {TransformResult} from './types.flow';
import type {LogEntry} from 'metro-core/src/Logger';
} from 'metro-transform-worker';

export type {JsTransformOptions as TransformOptions} from '../JSTransformer/worker';
export type {JsTransformOptions as TransformOptions} from 'metro-transform-worker';

export type Worker = {|
+transform: typeof transform,
Expand Down
4 changes: 2 additions & 2 deletions packages/metro/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@ const outputBundle = require('./shared/output/bundle');
const {loadConfig, mergeConfig, getDefaultConfig} = require('metro-config');
const {InspectorProxy} = require('metro-inspector-proxy');

import type {ServerOptions} from './Server';
import type {Graph} from './DeltaBundler';
import type {CustomTransformOptions} from './JSTransformer/worker';
import type {ServerOptions} from './Server';
import type {RequestOptions, OutputOptions} from './shared/types.flow.js';
import type {Server as HttpServer} from 'http';
import type {Server as HttpsServer} from 'https';
Expand All @@ -37,6 +36,7 @@ import type {
InputConfigT,
Middleware,
} from 'metro-config/src/configTypes.flow';
import type {CustomTransformOptions} from 'metro-transform-worker';
import typeof Yargs from 'yargs';

type MetroMiddleWare = {|
Expand Down
2 changes: 1 addition & 1 deletion packages/metro/src/lib/parseCustomTransformOptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

const nullthrows = require('nullthrows');

import type {CustomTransformOptions} from '../JSTransformer/worker';
import type {CustomTransformOptions} from 'metro-transform-worker';

const PREFIX = 'transform.';

Expand Down
2 changes: 1 addition & 1 deletion packages/metro/src/lib/transformHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ const path = require('path');
import type Bundler from '../Bundler';
import type {TransformOptions} from '../DeltaBundler/Worker';
import type DeltaBundler, {TransformFn} from '../DeltaBundler';
import type {Type} from '../JSTransformer/worker';
import type {ConfigT} from 'metro-config/src/configTypes.flow';
import type {Type} from 'metro-transform-worker';

type InlineRequiresRaw = {+blacklist: {[string]: true, ...}, ...} | boolean;

Expand Down
17 changes: 4 additions & 13 deletions packages/metro/src/shared/types.flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,15 @@
'use strict';

import type {Options as DeltaBundlerOptions} from '../DeltaBundler/types.flow';
import type {
CustomTransformOptions,
MinifierOptions,
} from '../JSTransformer/worker';
import type {TransformInputOptions} from '../lib/transformHelpers';
import type {
BasicSourceMap,
MixedSourceMap,
MetroSourceMapSegmentTuple,
} from 'metro-source-map';
import type {
CustomTransformOptions,
MinifierOptions,
} from 'metro-transform-worker';

type BundleType =
| 'bundle'
Expand Down Expand Up @@ -130,11 +129,3 @@ export type RequestOptions = {|
|};

export type {MinifierOptions};

export type MinifierResult = {
code: string,
map?: BasicSourceMap,
...
};

export type MetroMinifier = MinifierOptions => MinifierResult;

0 comments on commit 95ee7bb

Please sign in to comment.