mirror of
https://github.com/status-im/react-native.git
synced 2025-01-09 17:15:54 +00:00
e4621f4ce1
Summary: This diff exposes the new more generic way to configure transformers in `Metro` via the config parameter `transformerPath`. The new generic transformers can be used to transform any kind of file, since they don't call any JS-specific method and their API is generic. They only need to implement a single `transform` method: ``` async function transform( absolutePath: string, relativePath: string, fileContents: Buffer, options: TransformOptions, // very soon these will be configurable ): Promise<{ output: Array<mixed>, dependencies: Array<{ name: string, data: mixed, // very soon }>, }> { // ... } ``` Metro already had a `transformModulePath` config param, which was used to configure how babel was called in order to generate the AST. In order to avoid confusion, but keep the current open source transformer worker, I've renamed this param to `babelTransformerPath`. We can add a layer of compatibility and detect old config params in order to show a deprecation warning. Reviewed By: pvdz Differential Revision: D9070810 fbshipit-source-id: aebde879736026c09537f5d236eae24c06640abf
118 lines
3.2 KiB
JavaScript
118 lines
3.2 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const Metro = require('metro');
|
|
|
|
const denodeify = require('denodeify');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
async function dependencies(argv, configPromise, args, packagerInstance) {
|
|
const rootModuleAbsolutePath = args.entryFile;
|
|
const config = await configPromise;
|
|
if (!fs.existsSync(rootModuleAbsolutePath)) {
|
|
return Promise.reject(
|
|
new Error(`File ${rootModuleAbsolutePath} does not exist`),
|
|
);
|
|
}
|
|
|
|
config.cacheStores = [];
|
|
if (args.transformer) {
|
|
config.transformer.babelTransformerPath = path.resolve(args.transformer);
|
|
}
|
|
|
|
const relativePath = path.relative(
|
|
config.projectRoot,
|
|
rootModuleAbsolutePath,
|
|
);
|
|
|
|
const options = {
|
|
platform: args.platform,
|
|
entryFile: relativePath,
|
|
dev: args.dev,
|
|
minify: false,
|
|
generateSourceMaps: !args.dev,
|
|
};
|
|
|
|
const writeToFile = args.output;
|
|
const outStream = writeToFile
|
|
? fs.createWriteStream(args.output)
|
|
: process.stdout;
|
|
|
|
return Promise.resolve(
|
|
(packagerInstance
|
|
? packagerInstance.getOrderedDependencyPaths(options)
|
|
: Metro.getOrderedDependencyPaths(config, options)
|
|
).then(deps => {
|
|
deps.forEach(modulePath => {
|
|
// Temporary hack to disable listing dependencies not under this directory.
|
|
// Long term, we need either
|
|
// (a) JS code to not depend on anything outside this directory, or
|
|
// (b) Come up with a way to declare this dependency in Buck.
|
|
const isInsideProjectRoots =
|
|
config.watchFolders.filter(root => modulePath.startsWith(root))
|
|
.length > 0;
|
|
|
|
if (isInsideProjectRoots) {
|
|
outStream.write(modulePath + '\n');
|
|
}
|
|
});
|
|
return writeToFile
|
|
? denodeify(outStream.end).bind(outStream)()
|
|
: Promise.resolve();
|
|
}),
|
|
);
|
|
}
|
|
|
|
module.exports = {
|
|
name: 'dependencies',
|
|
description: 'lists dependencies',
|
|
func: dependencies,
|
|
options: [
|
|
{
|
|
command: '--entry-file <path>',
|
|
description: 'Absolute path to the root JS file',
|
|
},
|
|
{
|
|
command: '--output [path]',
|
|
description:
|
|
'File name where to store the output, ex. /tmp/dependencies.txt',
|
|
},
|
|
{
|
|
command: '--platform [extension]',
|
|
description: 'The platform extension used for selecting modules',
|
|
},
|
|
{
|
|
command: '--transformer [path]',
|
|
description: 'Specify a custom transformer to be used',
|
|
},
|
|
{
|
|
command: '--max-workers [number]',
|
|
description:
|
|
'Specifies the maximum number of workers the worker-pool ' +
|
|
'will spawn for transforming files. This defaults to the number of the ' +
|
|
'cores available on your machine.',
|
|
parse: (workers: string) => Number(workers),
|
|
},
|
|
{
|
|
command: '--dev [boolean]',
|
|
description: 'If false, skip all dev-only code path',
|
|
parse: val => (val === 'false' ? false : true),
|
|
default: true,
|
|
},
|
|
{
|
|
command: '--verbose',
|
|
description: 'Enables logging',
|
|
default: false,
|
|
},
|
|
],
|
|
};
|