mirror of
https://github.com/status-im/react-native.git
synced 2025-01-10 01:25:39 +00:00
a4badb8471
Summary: This changeset moves the creation of the transform cache at the top-level of the bundler so that: * we can use alternative folders, such as the project path itself, that I think will be more robust especially for OSS; * we can disable the cache completely, that is useful in some cases (for example, the script that fills the global cache). The reasons I believe a local project path is more robust are: * there are less likely conflicts between different users and different projects on a single machine; * the cache is de facto cleaned up if you clone a fresh copy of a project, something I think is desirable; * some people have been reporting that `tmpDir` just returns nothing; * finally, it prevents another user from writing malicious transformed code in the cache into the shared temp dir—only people with write access to the project have write access to the cache, that is consistent. Reviewed By: davidaurelio Differential Revision: D5113121 fbshipit-source-id: 74392733a0be306a7119516d7905fc43cd8c778e
187 lines
6.0 KiB
JavaScript
187 lines
6.0 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* @flow
|
|
*/
|
|
'use strict';
|
|
|
|
const blacklist = require('../../packager/blacklist');
|
|
const fs = require('fs');
|
|
const invariant = require('fbjs/lib/invariant');
|
|
const path = require('path');
|
|
|
|
const {providesModuleNodeModules} = require('../../packager/defaults');
|
|
|
|
const RN_CLI_CONFIG = 'rn-cli.config.js';
|
|
|
|
import type {GetTransformOptions, PostMinifyProcess, PostProcessModules} from '../../packager/src/Bundler';
|
|
import type {HasteImpl} from '../../packager/src/node-haste/Module';
|
|
import type {TransformVariants} from '../../packager/src/ModuleGraph/types.flow';
|
|
import type {PostProcessModules as PostProcessModulesForBuck} from '../../packager/src/ModuleGraph/types.flow.js';
|
|
|
|
/**
|
|
* Configuration file of the CLI.
|
|
*/
|
|
export type ConfigT = {
|
|
extraNodeModules: {[id: string]: string},
|
|
/**
|
|
* Specify any additional asset file extensions to be used by the packager.
|
|
* For example, if you want to include a .ttf file, you would return ['ttf']
|
|
* from here and use `require('./fonts/example.ttf')` inside your app.
|
|
*/
|
|
getAssetExts: () => Array<string>,
|
|
|
|
/**
|
|
* Returns a regular expression for modules that should be ignored by the
|
|
* packager on a given platform.
|
|
*/
|
|
getBlacklistRE(): RegExp,
|
|
|
|
/**
|
|
* Specify any additional polyfill modules that should be processed
|
|
* before regular module loading.
|
|
*/
|
|
getPolyfillModuleNames: () => Array<string>,
|
|
|
|
/**
|
|
* Specify any additional platforms to be used by the packager.
|
|
* For example, if you want to add a "custom" platform, and use modules
|
|
* ending in .custom.js, you would return ['custom'] here.
|
|
*/
|
|
getPlatforms: () => Array<string>,
|
|
|
|
getProjectRoots(): Array<string>,
|
|
|
|
/**
|
|
* Specify any additional node modules that should be processed for
|
|
* providesModule declarations.
|
|
*/
|
|
getProvidesModuleNodeModules?: () => Array<string>,
|
|
|
|
/**
|
|
* Specify any additional source file extensions to be used by the packager.
|
|
* For example, if you want to include a .ts file, you would return ['ts']
|
|
* from here and use `require('./module/example')` to require the file with
|
|
* path 'module/example.ts' inside your app.
|
|
*/
|
|
getSourceExts: () => Array<string>,
|
|
|
|
/**
|
|
* Returns the path to a custom transformer. This can also be overridden
|
|
* with the --transformer commandline argument.
|
|
*/
|
|
getTransformModulePath: () => string,
|
|
getTransformOptions: GetTransformOptions,
|
|
|
|
/**
|
|
* An optional function that can modify the code and source map of bundle
|
|
* after the minifaction took place.
|
|
*/
|
|
postMinifyProcess: PostMinifyProcess,
|
|
|
|
/**
|
|
* An optional function that can modify the module array before the bundle is
|
|
* finalized.
|
|
*/
|
|
postProcessModules: PostProcessModules,
|
|
|
|
/**
|
|
* Same as `postProcessModules` but for the Buck worker. Eventually we do want
|
|
* to unify both variants.
|
|
*/
|
|
postProcessModulesForBuck: PostProcessModulesForBuck,
|
|
|
|
/**
|
|
* A module that exports:
|
|
* - a `getHasteName(filePath)` method that returns `hasteName` for module at
|
|
* `filePath`, or undefined if `filePath` is not a haste module.
|
|
*/
|
|
hasteImpl?: HasteImpl,
|
|
|
|
transformVariants: () => TransformVariants,
|
|
};
|
|
|
|
const defaultConfig: ConfigT = {
|
|
extraNodeModules: Object.create(null),
|
|
getAssetExts: () => [],
|
|
getBlacklistRE: () => blacklist(),
|
|
getPlatforms: () => [],
|
|
getPolyfillModuleNames: () => [],
|
|
getProjectRoots: () => [process.cwd()],
|
|
getProvidesModuleNodeModules: () => providesModuleNodeModules.slice(),
|
|
getSourceExts: () => [],
|
|
getTransformModulePath: () => path.resolve(__dirname, '../../packager/transformer.js'),
|
|
getTransformOptions: async () => ({}),
|
|
postMinifyProcess: x => x,
|
|
postProcessModules: modules => modules,
|
|
postProcessModulesForBuck: modules => modules,
|
|
transformVariants: () => ({default: {}}),
|
|
};
|
|
|
|
/**
|
|
* Module capable of getting the configuration out of a given file.
|
|
*
|
|
* The function will return all the default configuration, as specified by the
|
|
* `defaultConfig` param overriden by those found on `rn-cli.config.js` files, if any. If no
|
|
* default config is provided and no configuration can be found in the directory
|
|
* hierarchy, an error will be thrown.
|
|
*/
|
|
const Config = {
|
|
find(startDir: string): ConfigT {
|
|
return this.findWithPath(startDir).config;
|
|
},
|
|
|
|
findWithPath(startDir: string): {config: ConfigT, projectPath: string} {
|
|
const configPath = findConfigPath(startDir);
|
|
invariant(
|
|
configPath,
|
|
`Can't find "${RN_CLI_CONFIG}" file in any parent folder of "${startDir}"`,
|
|
);
|
|
const projectPath = path.dirname(configPath);
|
|
return {config: this.loadFile(configPath, startDir), projectPath};
|
|
},
|
|
|
|
findOptional(startDir: string): ConfigT {
|
|
const configPath = findConfigPath(startDir);
|
|
return configPath
|
|
? this.loadFile(configPath, startDir)
|
|
: {...defaultConfig};
|
|
},
|
|
|
|
loadFile(pathToConfig: string): ConfigT {
|
|
//$FlowFixMe: necessary dynamic require
|
|
const config: {} = require(pathToConfig);
|
|
return {...defaultConfig, ...config};
|
|
},
|
|
};
|
|
|
|
function findConfigPath(cwd: string): ?string {
|
|
const parentDir = findParentDirectory(cwd, RN_CLI_CONFIG);
|
|
return parentDir ? path.join(parentDir, RN_CLI_CONFIG) : null;
|
|
}
|
|
|
|
// Finds the most near ancestor starting at `currentFullPath` that has
|
|
// a file named `filename`
|
|
function findParentDirectory(currentFullPath, filename) {
|
|
const root = path.parse(currentFullPath).root;
|
|
const testDir = (parts) => {
|
|
if (parts.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
const fullPath = path.join(root, parts.join(path.sep));
|
|
|
|
var exists = fs.existsSync(path.join(fullPath, filename));
|
|
return exists ? fullPath : testDir(parts.slice(0, -1));
|
|
};
|
|
|
|
return testDir(currentFullPath.substring(root.length).split(path.sep));
|
|
}
|
|
|
|
module.exports = Config;
|