mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-13 09:21:46 +08:00
Remove local-cli
Summary: This diff removes all files from the local-cli from react-native-github. The only leftover is the `cli.js` which redirects to `react-native-local-cli` and the templates folder which I'll move in a follow-up. This diff simply removes all files, it makes no code changes. There will be a cleanup diff on top of this one. Reviewed By: TheSavior Differential Revision: D13338367 fbshipit-source-id: 1afabdb34202596fb13186d728df74482c9bc609
This commit is contained in:
committed by
Facebook Github Bot
parent
d2318c403f
commit
cd43fb8005
@@ -1,2 +0,0 @@
|
||||
__fixtures__
|
||||
__tests__
|
||||
@@ -1,15 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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';
|
||||
|
||||
// beeper@1.1.0 has a return statement outside of a function
|
||||
// and therefore doesn't parse. Let's mock it so that we can
|
||||
// run the tests.
|
||||
module.exports = function() {};
|
||||
@@ -1,61 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 path = require('path');
|
||||
const MemoryFS = require('metro-memory-fs');
|
||||
let fs;
|
||||
|
||||
function setMockFilesystem(object, platform) {
|
||||
reset(platform);
|
||||
const root = platform === 'win32' ? 'c:\\' : '/';
|
||||
mockDir(root, {...object});
|
||||
return root;
|
||||
}
|
||||
|
||||
function mockDir(dirPath, desc) {
|
||||
for (const entName in desc) {
|
||||
const ent = desc[entName];
|
||||
const entPath = path.join(dirPath, entName);
|
||||
if (typeof ent === 'string' || ent instanceof Buffer) {
|
||||
fs.writeFileSync(entPath, ent);
|
||||
continue;
|
||||
}
|
||||
if (typeof ent !== 'object') {
|
||||
throw new Error(require('util').format('invalid entity:', ent));
|
||||
}
|
||||
if (ent.SYMLINK != null) {
|
||||
fs.symlinkSync(ent.SYMLINK, entPath);
|
||||
continue;
|
||||
}
|
||||
fs.mkdirSync(entPath);
|
||||
mockDir(entPath, ent);
|
||||
}
|
||||
}
|
||||
|
||||
function reset(platform) {
|
||||
if (path.mock == null) {
|
||||
throw new Error(
|
||||
'to use this "fs" module mock, you must also mock the "path" module',
|
||||
);
|
||||
}
|
||||
path.mock.reset(platform);
|
||||
const cwd = () => (platform === 'win32' ? 'c:\\' : '/');
|
||||
fs = new MemoryFS({platform, cwd});
|
||||
Object.assign(mockFs, fs);
|
||||
}
|
||||
|
||||
const mockFs = {};
|
||||
mockFs.__setMockFilesystem = setMockFilesystem;
|
||||
mockFs.mock = {clear: reset};
|
||||
|
||||
reset('posix');
|
||||
|
||||
module.exports = mockFs;
|
||||
@@ -1,22 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 mockPath = {};
|
||||
|
||||
function reset(platform) {
|
||||
Object.assign(mockPath, jest.requireActual('path')[platform]);
|
||||
}
|
||||
|
||||
mockPath.mock = {reset};
|
||||
|
||||
reset('posix');
|
||||
|
||||
module.exports = mockPath;
|
||||
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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';
|
||||
|
||||
function sign(source) {
|
||||
return source;
|
||||
}
|
||||
|
||||
module.exports = sign;
|
||||
@@ -1,76 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 log = require('../util/log').out('bundle');
|
||||
const Server = require('metro/src/Server');
|
||||
|
||||
const outputBundle = require('metro/src/shared/output/bundle');
|
||||
const path = require('path');
|
||||
const saveAssets = require('./saveAssets');
|
||||
|
||||
import type {RequestOptions, OutputOptions} from './types.flow';
|
||||
import type {ConfigT} from 'metro-config/src/configTypes.flow';
|
||||
|
||||
async function buildBundle(
|
||||
args: OutputOptions & {
|
||||
assetsDest: mixed,
|
||||
entryFile: string,
|
||||
maxWorkers: number,
|
||||
resetCache: boolean,
|
||||
transformer: string,
|
||||
minify: boolean,
|
||||
},
|
||||
configPromise: Promise<ConfigT>,
|
||||
/* $FlowFixMe(>=0.85.0 site=react_native_fb) This comment suppresses an error
|
||||
* found when Flow v0.85 was deployed. To see the error, delete this comment
|
||||
* and run Flow. */
|
||||
output = outputBundle,
|
||||
) {
|
||||
// This is used by a bazillion of npm modules we don't control so we don't
|
||||
// have other choice than defining it as an env variable here.
|
||||
process.env.NODE_ENV = args.dev ? 'development' : 'production';
|
||||
const config = await configPromise;
|
||||
|
||||
let sourceMapUrl = args.sourcemapOutput;
|
||||
if (sourceMapUrl && !args.sourcemapUseAbsolutePath) {
|
||||
sourceMapUrl = path.basename(sourceMapUrl);
|
||||
}
|
||||
|
||||
const requestOpts: RequestOptions = {
|
||||
entryFile: args.entryFile,
|
||||
sourceMapUrl,
|
||||
dev: args.dev,
|
||||
minify: args.minify !== undefined ? args.minify : !args.dev,
|
||||
platform: args.platform,
|
||||
};
|
||||
|
||||
const server = new Server({...config, resetCache: args.resetCache});
|
||||
|
||||
try {
|
||||
const bundle = await output.build(server, requestOpts);
|
||||
|
||||
await output.save(bundle, args, log);
|
||||
|
||||
// Save the assets of the bundle
|
||||
const outputAssets = await server.getAssets({
|
||||
...Server.DEFAULT_BUNDLE_OPTIONS,
|
||||
...requestOpts,
|
||||
bundleType: 'todo',
|
||||
});
|
||||
|
||||
// When we're done saving bundle output and the assets, we're done.
|
||||
return await saveAssets(outputAssets, args.platform, args.assetsDest);
|
||||
} finally {
|
||||
server.end();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = buildBundle;
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 buildBundle = require('./buildBundle');
|
||||
const bundleCommandLineArgs = require('./bundleCommandLineArgs');
|
||||
const outputBundle = require('metro/src/shared/output/bundle');
|
||||
|
||||
/**
|
||||
* Builds the bundle starting to look for dependencies at the given entry path.
|
||||
*/
|
||||
function bundleWithOutput(argv, configPromise, args, output) {
|
||||
if (!output) {
|
||||
output = outputBundle;
|
||||
}
|
||||
return buildBundle(args, configPromise, output);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'bundle',
|
||||
description: 'builds the javascript bundle for offline use',
|
||||
func: bundleWithOutput,
|
||||
options: bundleCommandLineArgs,
|
||||
|
||||
// not used by the CLI itself
|
||||
withOutput: bundleWithOutput,
|
||||
};
|
||||
@@ -1,96 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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';
|
||||
|
||||
module.exports = [
|
||||
{
|
||||
command: '--entry-file <path>',
|
||||
description:
|
||||
'Path to the root JS file, either absolute or relative to JS root',
|
||||
},
|
||||
{
|
||||
command: '--platform [string]',
|
||||
description: 'Either "ios" or "android"',
|
||||
default: 'ios',
|
||||
},
|
||||
{
|
||||
command: '--transformer [string]',
|
||||
description: 'Specify a custom transformer to be used',
|
||||
},
|
||||
{
|
||||
command: '--dev [boolean]',
|
||||
description: 'If false, warnings are disabled and the bundle is minified',
|
||||
parse: val => (val === 'false' ? false : true),
|
||||
default: true,
|
||||
},
|
||||
{
|
||||
command: '--minify [boolean]',
|
||||
description:
|
||||
'Allows overriding whether bundle is minified. This defaults to ' +
|
||||
'false if dev is true, and true if dev is false. Disabling minification ' +
|
||||
'can be useful for speeding up production builds for testing purposes.',
|
||||
parse: val => (val === 'false' ? false : true),
|
||||
},
|
||||
{
|
||||
command: '--bundle-output <string>',
|
||||
description:
|
||||
'File name where to store the resulting bundle, ex. /tmp/groups.bundle',
|
||||
},
|
||||
{
|
||||
command: '--bundle-encoding [string]',
|
||||
description:
|
||||
'Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).',
|
||||
default: 'utf8',
|
||||
},
|
||||
{
|
||||
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: '--sourcemap-output [string]',
|
||||
description:
|
||||
'File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map',
|
||||
},
|
||||
{
|
||||
command: '--sourcemap-sources-root [string]',
|
||||
description:
|
||||
"Path to make sourcemap's sources entries relative to, ex. /root/dir",
|
||||
},
|
||||
{
|
||||
command: '--sourcemap-use-absolute-path',
|
||||
description: 'Report SourceMapURL using its full path',
|
||||
default: false,
|
||||
},
|
||||
{
|
||||
command: '--assets-dest [string]',
|
||||
description:
|
||||
'Directory name where to store assets referenced in the bundle',
|
||||
},
|
||||
{
|
||||
command: '--verbose',
|
||||
description: 'Enables logging',
|
||||
default: false,
|
||||
},
|
||||
{
|
||||
command: '--reset-cache',
|
||||
description: 'Removes cached files',
|
||||
default: false,
|
||||
},
|
||||
{
|
||||
command: '--read-global-cache',
|
||||
description:
|
||||
'Try to fetch transformed JS code from the global cache, if configured.',
|
||||
default: false,
|
||||
},
|
||||
];
|
||||
@@ -1,46 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const ALLOWED_SCALES = {
|
||||
ios: [1, 2, 3],
|
||||
};
|
||||
|
||||
function filterPlatformAssetScales(
|
||||
platform: string,
|
||||
scales: $ReadOnlyArray<number>,
|
||||
): $ReadOnlyArray<number> {
|
||||
const whitelist = ALLOWED_SCALES[platform];
|
||||
if (!whitelist) {
|
||||
return scales;
|
||||
}
|
||||
const result = scales.filter(scale => whitelist.indexOf(scale) > -1);
|
||||
if (result.length === 0 && scales.length > 0) {
|
||||
// No matching scale found, but there are some available. Ideally we don't
|
||||
// want to be in this situation and should throw, but for now as a fallback
|
||||
// let's just use the closest larger image
|
||||
const maxScale = whitelist[whitelist.length - 1];
|
||||
for (const scale of scales) {
|
||||
if (scale > maxScale) {
|
||||
result.push(scale);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// There is no larger scales available, use the largest we have
|
||||
if (result.length === 0) {
|
||||
result.push(scales[scales.length - 1]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
module.exports = filterPlatformAssetScales;
|
||||
@@ -1,27 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @flow strict
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const assetPathUtils = require('../../Libraries/Image/assetPathUtils');
|
||||
const path = require('path');
|
||||
|
||||
import type {PackagerAsset} from '../../Libraries/Image/AssetRegistry';
|
||||
|
||||
function getAssetDestPathAndroid(asset: PackagerAsset, scale: number): string {
|
||||
const androidFolder = assetPathUtils.getAndroidResourceFolderName(
|
||||
asset,
|
||||
scale,
|
||||
);
|
||||
const fileName = assetPathUtils.getAndroidResourceIdentifier(asset);
|
||||
return path.join(androidFolder, fileName + '.' + asset.type);
|
||||
}
|
||||
|
||||
module.exports = getAssetDestPathAndroid;
|
||||
@@ -1,23 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @flow strict
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
|
||||
import type {PackagerAsset} from '../../Libraries/Image/AssetRegistry';
|
||||
|
||||
function getAssetDestPathIOS(asset: PackagerAsset, scale: number): string {
|
||||
const suffix = scale === 1 ? '' : '@' + scale + 'x';
|
||||
const fileName = asset.name + suffix + '.' + asset.type;
|
||||
return path.join(asset.httpServerLocation.substr(1), fileName);
|
||||
}
|
||||
|
||||
module.exports = getAssetDestPathIOS;
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 bundleWithOutput = require('./bundle').withOutput;
|
||||
const bundleCommandLineArgs = require('./bundleCommandLineArgs');
|
||||
const outputUnbundle = require('metro/src/shared/output/RamBundle');
|
||||
|
||||
/**
|
||||
* Builds the bundle starting to look for dependencies at the given entry path.
|
||||
*/
|
||||
function ramBundle(argv, config, args) {
|
||||
return bundleWithOutput(argv, config, args, outputUnbundle);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'ram-bundle',
|
||||
description:
|
||||
'builds javascript as a "Random Access Module" bundle for offline use',
|
||||
func: ramBundle,
|
||||
options: bundleCommandLineArgs.concat({
|
||||
command: '--indexed-ram-bundle',
|
||||
description:
|
||||
'Force the "Indexed RAM" bundle file format, even when building for android',
|
||||
default: false,
|
||||
}),
|
||||
};
|
||||
@@ -1,84 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 filterPlatformAssetScales = require('./filterPlatformAssetScales');
|
||||
const fs = require('fs');
|
||||
const getAssetDestPathAndroid = require('./getAssetDestPathAndroid');
|
||||
const getAssetDestPathIOS = require('./getAssetDestPathIOS');
|
||||
const log = require('../util/log').out('bundle');
|
||||
const mkdirp = require('mkdirp');
|
||||
const path = require('path');
|
||||
|
||||
function saveAssets(assets, platform, assetsDest) {
|
||||
if (!assetsDest) {
|
||||
console.warn('Assets destination folder is not set, skipping...');
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
const getAssetDestPath =
|
||||
platform === 'android' ? getAssetDestPathAndroid : getAssetDestPathIOS;
|
||||
|
||||
const filesToCopy = Object.create(null); // Map src -> dest
|
||||
assets.forEach(asset => {
|
||||
const validScales = new Set(
|
||||
filterPlatformAssetScales(platform, asset.scales),
|
||||
);
|
||||
asset.scales.forEach((scale, idx) => {
|
||||
if (!validScales.has(scale)) {
|
||||
return;
|
||||
}
|
||||
const src = asset.files[idx];
|
||||
const dest = path.join(assetsDest, getAssetDestPath(asset, scale));
|
||||
filesToCopy[src] = dest;
|
||||
});
|
||||
});
|
||||
|
||||
return copyAll(filesToCopy);
|
||||
}
|
||||
|
||||
function copyAll(filesToCopy) {
|
||||
const queue = Object.keys(filesToCopy);
|
||||
if (queue.length === 0) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
log('Copying ' + queue.length + ' asset files');
|
||||
return new Promise((resolve, reject) => {
|
||||
const copyNext = error => {
|
||||
if (error) {
|
||||
return reject(error);
|
||||
}
|
||||
if (queue.length === 0) {
|
||||
log('Done copying assets');
|
||||
resolve();
|
||||
} else {
|
||||
const src = queue.shift();
|
||||
const dest = filesToCopy[src];
|
||||
copy(src, dest, copyNext);
|
||||
}
|
||||
};
|
||||
copyNext();
|
||||
});
|
||||
}
|
||||
|
||||
function copy(src, dest, callback) {
|
||||
const destDir = path.dirname(dest);
|
||||
mkdirp(destDir, err => {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
fs.createReadStream(src)
|
||||
.pipe(fs.createWriteStream(dest))
|
||||
.on('finish', callback);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = saveAssets;
|
||||
@@ -1,13 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @flow
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
export type {OutputOptions, RequestOptions} from 'metro/src/shared/types.flow';
|
||||
@@ -1,169 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @flow
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const {configPromise} = require('./core');
|
||||
|
||||
const assertRequiredOptions = require('./util/assertRequiredOptions');
|
||||
/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error
|
||||
* found when Flow v0.54 was deployed. To see the error delete this comment and
|
||||
* run Flow. */
|
||||
const chalk = require('chalk');
|
||||
const childProcess = require('child_process');
|
||||
/* $FlowFixMe(>=0.54.0 site=react_native_oss) This comment suppresses an error
|
||||
* found when Flow v0.54 was deployed. To see the error delete this comment and
|
||||
* run Flow. */
|
||||
const commander = require('commander');
|
||||
const commands = require('./commands');
|
||||
const init = require('./init/init');
|
||||
const path = require('path');
|
||||
const pkg = require('../package.json');
|
||||
|
||||
import type {CommandT} from './commands';
|
||||
import type {RNConfig} from './core';
|
||||
|
||||
commander.version(pkg.version);
|
||||
|
||||
const defaultOptParser = val => val;
|
||||
|
||||
const handleError = err => {
|
||||
console.error();
|
||||
console.error(err.message || err);
|
||||
console.error();
|
||||
if (err.stack) {
|
||||
console.error(err.stack);
|
||||
console.error();
|
||||
}
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
// Custom printHelpInformation command inspired by internal Commander.js
|
||||
// one modified to suit our needs
|
||||
function printHelpInformation() {
|
||||
let cmdName = this._name;
|
||||
if (this._alias) {
|
||||
cmdName = cmdName + '|' + this._alias;
|
||||
}
|
||||
|
||||
const sourceInformation = this.pkg
|
||||
? [` ${chalk.bold('Source:')} ${this.pkg.name}@${this.pkg.version}`, '']
|
||||
: [];
|
||||
|
||||
let output = [
|
||||
'',
|
||||
chalk.bold(chalk.cyan(` react-native ${cmdName} ${this.usage()}`)),
|
||||
this._description ? ` ${this._description}` : '',
|
||||
'',
|
||||
...sourceInformation,
|
||||
` ${chalk.bold('Options:')}`,
|
||||
'',
|
||||
this.optionHelp().replace(/^/gm, ' '),
|
||||
'',
|
||||
];
|
||||
|
||||
if (this.examples && this.examples.length > 0) {
|
||||
const formattedUsage = this.examples
|
||||
.map(example => ` ${example.desc}: \n ${chalk.cyan(example.cmd)}`)
|
||||
.join('\n\n');
|
||||
|
||||
output = output.concat([
|
||||
chalk.bold(' Example usage:'),
|
||||
'',
|
||||
formattedUsage,
|
||||
]);
|
||||
}
|
||||
|
||||
return output.concat(['', '']).join('\n');
|
||||
}
|
||||
|
||||
function printUnknownCommand(cmdName) {
|
||||
console.log(
|
||||
[
|
||||
'',
|
||||
cmdName
|
||||
? chalk.red(` Unrecognized command '${cmdName}'`)
|
||||
: chalk.red(" You didn't pass any command"),
|
||||
` Run ${chalk.cyan(
|
||||
'react-native --help',
|
||||
)} to see list of all available commands`,
|
||||
'',
|
||||
].join('\n'),
|
||||
);
|
||||
}
|
||||
|
||||
const addCommand = (command: CommandT, cfg: RNConfig) => {
|
||||
const options = command.options || [];
|
||||
|
||||
const cmd = commander
|
||||
.command(command.name, undefined, {
|
||||
noHelp: !command.description,
|
||||
})
|
||||
.description(command.description)
|
||||
.action(function runAction() {
|
||||
const passedOptions = this.opts();
|
||||
const argv: Array<string> = Array.from(arguments).slice(0, -1);
|
||||
|
||||
Promise.resolve()
|
||||
.then(() => {
|
||||
assertRequiredOptions(options, passedOptions);
|
||||
return command.func(argv, cfg, passedOptions);
|
||||
})
|
||||
.catch(handleError);
|
||||
});
|
||||
|
||||
cmd.helpInformation = printHelpInformation.bind(cmd);
|
||||
cmd.examples = command.examples;
|
||||
cmd.pkg = command.pkg;
|
||||
|
||||
options.forEach(opt =>
|
||||
cmd.option(
|
||||
opt.command,
|
||||
opt.description,
|
||||
opt.parse || defaultOptParser,
|
||||
typeof opt.default === 'function' ? opt.default(cfg) : opt.default,
|
||||
),
|
||||
);
|
||||
|
||||
// Placeholder option for --config, which is parsed before any other option,
|
||||
// but needs to be here to avoid "unknown option" errors when specified
|
||||
cmd.option('--config [string]', 'Path to the CLI configuration file');
|
||||
};
|
||||
|
||||
async function run() {
|
||||
const config = await configPromise;
|
||||
const setupEnvScript = /^win/.test(process.platform)
|
||||
? 'setup_env.bat'
|
||||
: 'setup_env.sh';
|
||||
|
||||
childProcess.execFileSync(path.join(__dirname, setupEnvScript));
|
||||
|
||||
commands.forEach(cmd => addCommand(cmd, config));
|
||||
|
||||
commander.parse(process.argv);
|
||||
|
||||
const isValidCommand = commands.find(
|
||||
cmd => cmd.name.split(' ')[0] === process.argv[2],
|
||||
);
|
||||
|
||||
if (!isValidCommand) {
|
||||
printUnknownCommand(process.argv[2]);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!commander.args.length) {
|
||||
commander.help();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
run: run,
|
||||
init: init,
|
||||
};
|
||||
@@ -1,79 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @flow
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const {getProjectCommands} = require('./core');
|
||||
|
||||
import type {RNConfig} from './core';
|
||||
|
||||
export type CommandT = {
|
||||
name: string,
|
||||
description?: string,
|
||||
usage?: string,
|
||||
func: (argv: Array<string>, config: RNConfig, args: Object) => ?Promise<void>,
|
||||
options?: Array<{
|
||||
command: string,
|
||||
description?: string,
|
||||
parse?: (val: string) => any,
|
||||
default?: ((config: RNConfig) => mixed) | mixed,
|
||||
}>,
|
||||
examples?: Array<{
|
||||
desc: string,
|
||||
cmd: string,
|
||||
}>,
|
||||
pkg?: {
|
||||
version: string,
|
||||
name: string,
|
||||
},
|
||||
};
|
||||
|
||||
const documentedCommands = [
|
||||
require('./server/server'),
|
||||
require('./runIOS/runIOS'),
|
||||
require('./runAndroid/runAndroid'),
|
||||
require('./library/library'),
|
||||
require('./bundle/bundle'),
|
||||
require('./bundle/ramBundle'),
|
||||
require('./eject/eject'),
|
||||
require('./link/link'),
|
||||
require('./link/unlink'),
|
||||
require('./install/install'),
|
||||
require('./install/uninstall'),
|
||||
require('./upgrade/upgrade'),
|
||||
require('./logAndroid/logAndroid'),
|
||||
require('./logIOS/logIOS'),
|
||||
require('./dependencies/dependencies'),
|
||||
require('./info/info'),
|
||||
];
|
||||
|
||||
// The user should never get here because projects are inited by
|
||||
// using `react-native-cli` from outside a project directory.
|
||||
const undocumentedCommands = [
|
||||
{
|
||||
name: 'init',
|
||||
func: () => {
|
||||
console.log(
|
||||
[
|
||||
'Looks like React Native project already exists in the current',
|
||||
'folder. Run this command from a different folder or remove node_modules/react-native',
|
||||
].join('\n'),
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const commands: Array<CommandT> = [
|
||||
...documentedCommands,
|
||||
...undocumentedCommands,
|
||||
...getProjectCommands(),
|
||||
];
|
||||
|
||||
module.exports = commands;
|
||||
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const ASSET_REGISTRY_PATH = 'react-native/Libraries/Image/AssetRegistry';
|
||||
const ASSET_SOURCE_RESOLVER_PATH =
|
||||
'react-native/Libraries/Image/AssetSourceResolver';
|
||||
|
||||
module.exports = {
|
||||
ASSET_REGISTRY_PATH,
|
||||
ASSET_SOURCE_RESOLVER_PATH,
|
||||
};
|
||||
@@ -1,93 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
const fs = jest.requireActual('fs');
|
||||
const path = jest.requireActual('path');
|
||||
|
||||
const manifest = fs.readFileSync(
|
||||
path.join(__dirname, './files/AndroidManifest.xml'),
|
||||
);
|
||||
const mainJavaClass = fs.readFileSync(
|
||||
path.join(__dirname, './files/Main.java'),
|
||||
);
|
||||
|
||||
function generateValidFileStructure(classFileName) {
|
||||
return {
|
||||
src: {
|
||||
'AndroidManifest.xml': manifest,
|
||||
main: {
|
||||
com: {
|
||||
some: {
|
||||
example: {
|
||||
'Main.java': mainJavaClass,
|
||||
[classFileName]: fs.readFileSync(
|
||||
path.join(__dirname, `./files/${classFileName}`),
|
||||
),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
exports.valid = generateValidFileStructure('ReactPackage.java');
|
||||
|
||||
exports.validKotlin = generateValidFileStructure('ReactPackage.kt');
|
||||
|
||||
exports.userConfigManifest = {
|
||||
src: {
|
||||
main: {
|
||||
'AndroidManifest.xml': manifest,
|
||||
com: {
|
||||
some: {
|
||||
example: {
|
||||
'Main.java': mainJavaClass,
|
||||
'ReactPackage.java': fs.readFileSync(
|
||||
path.join(__dirname, './files/ReactPackage.java'),
|
||||
),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
debug: {
|
||||
'AndroidManifest.xml': fs.readFileSync(
|
||||
path.join(__dirname, './files/AndroidManifest-debug.xml'),
|
||||
),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
exports.corrupted = {
|
||||
src: {
|
||||
'AndroidManifest.xml': manifest,
|
||||
main: {
|
||||
com: {
|
||||
some: {
|
||||
example: {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
exports.noPackage = {
|
||||
src: {
|
||||
'AndroidManifest.xml': manifest,
|
||||
main: {
|
||||
com: {
|
||||
some: {
|
||||
example: {
|
||||
'Main.java': mainJavaClass,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -1,27 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
exports.single = {
|
||||
func: () => {},
|
||||
description: 'Test action',
|
||||
name: 'test',
|
||||
};
|
||||
|
||||
exports.multiple = [
|
||||
{
|
||||
func: () => {},
|
||||
description: 'Test action #1',
|
||||
name: 'test1',
|
||||
},
|
||||
{
|
||||
func: () => {},
|
||||
description: 'Test action #2',
|
||||
name: 'test2',
|
||||
},
|
||||
];
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
const fs = jest.requireActual('fs');
|
||||
const path = require('path');
|
||||
const android = require('./android');
|
||||
|
||||
const pjson = fs.readFileSync(path.join(__dirname, 'files', 'package.json'));
|
||||
|
||||
module.exports = {
|
||||
valid: {
|
||||
'package.json': pjson,
|
||||
android: android.valid,
|
||||
},
|
||||
withAssets: {
|
||||
'package.json': pjson,
|
||||
android: android.valid,
|
||||
fonts: {
|
||||
'A.ttf': '',
|
||||
'B.ttf': '',
|
||||
},
|
||||
images: {
|
||||
'C.jpg': '',
|
||||
},
|
||||
},
|
||||
noPackage: {
|
||||
'package.json': pjson,
|
||||
android: android.noPackage,
|
||||
},
|
||||
};
|
||||
@@ -1,3 +0,0 @@
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
</manifest>
|
||||
@@ -1,4 +0,0 @@
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.some.example">
|
||||
</manifest>
|
||||
@@ -1,15 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.some.example;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class SomeExamplePackage {}
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.some.example;
|
||||
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.react.bridge.NativeModule;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class SomeExampleJavaPackage implements ReactPackage {
|
||||
|
||||
@Override
|
||||
public List<NativeModule> createNativeModules(
|
||||
ReactApplicationContext reactContext) {
|
||||
List<NativeModule> modules = new ArrayList<>();
|
||||
modules.add(new SomeExampleModule(reactContext));
|
||||
return modules;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.some.example;
|
||||
|
||||
import android.view.View
|
||||
import com.facebook.react.ReactPackage
|
||||
import com.facebook.react.bridge.NativeModule
|
||||
import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.uimanager.ReactShadowNode
|
||||
import com.facebook.react.uimanager.ViewManager
|
||||
import java.util.*
|
||||
|
||||
class SomeExampleKotlinPackage : ReactPackage {
|
||||
|
||||
override fun createNativeModules(reactContext: ReactApplicationContext): MutableList<NativeModule>
|
||||
= mutableListOf(MaterialPaletteModule(reactContext))
|
||||
|
||||
override fun createViewManagers(reactContext: ReactApplicationContext?):
|
||||
MutableList<ViewManager<View, ReactShadowNode>> = Collections.emptyList()
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
{
|
||||
"name": "react-native-vector-icons",
|
||||
"version": "1.0.0",
|
||||
"description": "Customizable Icons for React Native with support for NavBar/TabBar, image source and full styling. Choose from 3000+ bundled icons or use your own.",
|
||||
"main": "index.js",
|
||||
"bin": {
|
||||
"generate-icon": "./generate-icon.js"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"build": "rm -rf {Fonts,Entypo.js,EvilIcons.js,FontAwesome.js,Foundation.js,Ionicons.js,MaterialIcons.js,Octicons.js,Zocial.js} && mkdir Fonts && npm run build-entypo && npm run build-evilicons && npm run build-fontawesome && npm run build-foundation && npm run build-ionicons && npm run build-materialicons && npm run build-octicons && npm run build-zocial",
|
||||
"build-entypo": "mkdir -p tmp/svg && curl https://dl.dropboxusercontent.com/u/4339492/entypo.zip > tmp/entypo.zip && unzip -j tmp/entypo.zip *.svg -x __MACOSX/* -d tmp/svg && fontcustom compile tmp/svg -o tmp -n Entypo -t css -h && node generate-icon tmp/Entypo.css --componentName=Entypo --fontFamily=Entypo > Entypo.js && cp tmp/Entypo.ttf Fonts && rm -rf {tmp,.fontcustom-manifest.json}",
|
||||
"build-evilicons": "fontcustom compile node_modules/evil-icons/assets/icons -o tmp -n EvilIcons -t css -h && node generate-icon tmp/EvilIcons.css --prefix=.icon-ei- --componentName=EvilIcons --fontFamily=EvilIcons > EvilIcons.js && cp tmp/EvilIcons.ttf Fonts && rm -rf {tmp,.fontcustom-manifest.json}",
|
||||
"build-fontawesome": "node generate-icon node_modules/font-awesome/css/font-awesome.css --prefix=.fa- --componentName=FontAwesome --fontFamily=FontAwesome > FontAwesome.js && cp node_modules/font-awesome/fonts/fontawesome-webfont.ttf Fonts/FontAwesome.ttf",
|
||||
"build-foundation": "node generate-icon bower_components/foundation-icon-fonts/foundation-icons.css --prefix=.fi- --componentName=Foundation --fontFamily=fontcustom > Foundation.js && cp bower_components/foundation-icon-fonts/foundation-icons.ttf Fonts/Foundation.ttf",
|
||||
"build-ionicons": "node generate-icon bower_components/ionicons/css/ionicons.css --prefix=.ion- --componentName=Ionicons --fontFamily=Ionicons > Ionicons.js && cp bower_components/ionicons/fonts/ionicons.ttf Fonts/Ionicons.ttf",
|
||||
"build-materialicons": "mkdir -p tmp/svg && for f in ./node_modules/material-design-icons/*/svg/production/ic_*_48px.svg; do t=${f/*\\/ic_/}; t=${t/_48px/}; cp \"$f\" \"./tmp/svg/${t//_/-}\"; done && fontcustom compile tmp/svg -o tmp -n MaterialIcons -t css -h && node generate-icon tmp/MaterialIcons.css --componentName=MaterialIcons --fontFamily=MaterialIcons > MaterialIcons.js && cp tmp/MaterialIcons.ttf Fonts && rm -rf {tmp,.fontcustom-manifest.json}",
|
||||
"build-octicons": "node generate-icon bower_components/octicons/octicons/octicons.css --prefix=.octicon- --componentName=Octicons --fontFamily=octicons > Octicons.js && cp bower_components/octicons/octicons/octicons.ttf Fonts/Octicons.ttf",
|
||||
"build-zocial": "node generate-icon bower_components/css-social-buttons/css/zocial.css --prefix=.zocial. --componentName=Zocial --fontFamily=zocial > Zocial.js && cp bower_components/css-social-buttons/css/zocial.ttf Fonts/Zocial.ttf"
|
||||
},
|
||||
"keywords": [
|
||||
"react-native",
|
||||
"react-component",
|
||||
"react-native-component",
|
||||
"react",
|
||||
"mobile",
|
||||
"ios",
|
||||
"android",
|
||||
"ui",
|
||||
"icon",
|
||||
"icons",
|
||||
"vector",
|
||||
"retina",
|
||||
"font"
|
||||
],
|
||||
"author": {
|
||||
"name": "Joel Arvidsson",
|
||||
"email": "joel@oblador.se"
|
||||
},
|
||||
"homepage": "https://github.com/oblador/react-native-vector-icons",
|
||||
"bugs": {
|
||||
"url": "https://github.com/oblador/react-native-vector-icons/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/oblador/react-native-vector-icons.git"
|
||||
},
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"react-native": ">=0.4.0 || 0.5.0-rc1 || 0.6.0-rc || 0.7.0-rc || 0.7.0-rc.2 || 0.8.0-rc || 0.8.0-rc.2 || 0.9.0-rc || 0.10.0-rc || 0.11.0-rc || 0.12.0-rc || 0.13.0-rc || 0.14.0-rc || 0.15.0-rc || 0.16.0-rc"
|
||||
},
|
||||
"dependencies": {
|
||||
"lodash": "^4.17.10",
|
||||
"yargs": "^3.30.0",
|
||||
"rnpm-plugin-test": "*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"evil-icons": "^1.7.6",
|
||||
"font-awesome": "^4.4.0",
|
||||
"material-design-icons": "^2.1.1"
|
||||
}
|
||||
}
|
||||
@@ -1,804 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
/* Begin PBXBuildFile section */
|
||||
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
|
||||
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
|
||||
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
|
||||
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
|
||||
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
|
||||
00E356F31AD99517003FC87E /* androidTestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* androidTestTests.m */; };
|
||||
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
|
||||
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
|
||||
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
|
||||
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
|
||||
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
|
||||
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
||||
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
||||
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
|
||||
672DE8B31B124B8088D0D29F /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B5255B7628A54AC2A9B4B2A0 /* libBVLinearGradient.a */; };
|
||||
68FEB18F24414EF981BD7940 /* libCodePush.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 53C67FE8F7294B7A83790610 /* libCodePush.a */; };
|
||||
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
|
||||
C6C437D070BA42D6BE39198B /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A7396DFBAFA4CA092E367F5 /* libRCTVideo.a */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||
remoteInfo = RCTActionSheet;
|
||||
};
|
||||
00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||
remoteInfo = RCTGeolocation;
|
||||
};
|
||||
00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
|
||||
remoteInfo = RCTImage;
|
||||
};
|
||||
00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 58B511DB1A9E6C8500147676;
|
||||
remoteInfo = RCTNetwork;
|
||||
};
|
||||
00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
|
||||
remoteInfo = RCTVibration;
|
||||
};
|
||||
00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
|
||||
remoteInfo = androidTest;
|
||||
};
|
||||
139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||
remoteInfo = RCTSettings;
|
||||
};
|
||||
139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
|
||||
remoteInfo = RCTWebSocket;
|
||||
};
|
||||
146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
|
||||
remoteInfo = React;
|
||||
};
|
||||
78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||
remoteInfo = RCTLinking;
|
||||
};
|
||||
832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
|
||||
proxyType = 2;
|
||||
remoteGlobalIDString = 58B5119B1A9E6C1200147676;
|
||||
remoteInfo = RCTText;
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
|
||||
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = "<group>"; };
|
||||
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = "<group>"; };
|
||||
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = "<group>"; };
|
||||
00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = "<group>"; };
|
||||
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = "<group>"; };
|
||||
00E356EE1AD99517003FC87E /* androidTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = androidTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
00E356F21AD99517003FC87E /* androidTestTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = androidTestTests.m; sourceTree = "<group>"; };
|
||||
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
|
||||
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
|
||||
13B07F961A680F5B00A75B9A /* androidTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = androidTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = androidTest/AppDelegate.h; sourceTree = "<group>"; };
|
||||
13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = androidTest/AppDelegate.m; sourceTree = "<group>"; };
|
||||
13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
|
||||
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = androidTest/Images.xcassets; sourceTree = "<group>"; };
|
||||
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = androidTest/Info.plist; sourceTree = "<group>"; };
|
||||
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = androidTest/main.m; sourceTree = "<group>"; };
|
||||
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
|
||||
53C67FE8F7294B7A83790610 /* libCodePush.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libCodePush.a; sourceTree = "<group>"; };
|
||||
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
|
||||
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
|
||||
B5255B7628A54AC2A9B4B2A0 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBVLinearGradient.a; sourceTree = "<group>"; };
|
||||
467A6CBCB2164E7D9B673D4C /* CodePush.xcodeproj */ = {isa = PBXFileReference; name = "CodePush.xcodeproj"; path = "../node_modules/react-native-code-push/CodePush.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
|
||||
FD7121847BA447D8B737F22A /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; name = "BVLinearGradient.xcodeproj"; path = "../node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
|
||||
409DA945815C46DEB4F254DB /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; name = "RCTVideo.xcodeproj"; path = "../node_modules/react-native-video/RCTVideo.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
|
||||
3A7396DFBAFA4CA092E367F5 /* libRCTVideo.a */ = {isa = PBXFileReference; name = "libRCTVideo.a"; path = "libRCTVideo.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
00E356EB1AD99517003FC87E /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
146834051AC3E58100842450 /* libReact.a in Frameworks */,
|
||||
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
|
||||
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
|
||||
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
|
||||
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
|
||||
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
|
||||
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
|
||||
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
|
||||
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
|
||||
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
|
||||
672DE8B31B124B8088D0D29F /* libBVLinearGradient.a in Frameworks */,
|
||||
68FEB18F24414EF981BD7940 /* libCodePush.a in Frameworks */,
|
||||
C6C437D070BA42D6BE39198B /* libRCTVideo.a in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
00C302A81ABCB8CE00DB3ED1 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
00C302B61ABCB90400DB3ED1 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
00C302BC1ABCB91800DB3ED1 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
00C302D41ABCB9D200DB3ED1 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
00C302E01ABCB9EE00DB3ED1 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
00E356EF1AD99517003FC87E /* androidTestTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00E356F21AD99517003FC87E /* androidTestTests.m */,
|
||||
00E356F01AD99517003FC87E /* Supporting Files */,
|
||||
);
|
||||
path = androidTestTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
00E356F01AD99517003FC87E /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
00E356F11AD99517003FC87E /* Info.plist */,
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
139105B71AF99BAD00B5F7CC /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
139FDEE71B06529A00C62182 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
13B07FAE1A68108700A75B9A /* androidTest */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
|
||||
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
|
||||
13B07FB01A68108700A75B9A /* AppDelegate.m */,
|
||||
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
||||
13B07FB61A68108700A75B9A /* Info.plist */,
|
||||
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
|
||||
13B07FB71A68108700A75B9A /* main.m */,
|
||||
);
|
||||
name = androidTest;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
146834001AC3E56700842450 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
146834041AC3E56700842450 /* libReact.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
78C398B11ACF4ADC00677621 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
146833FF1AC3E56700842450 /* React.xcodeproj */,
|
||||
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
|
||||
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
|
||||
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
|
||||
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
|
||||
00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
|
||||
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
|
||||
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
|
||||
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
|
||||
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
|
||||
467A6CBCB2164E7D9B673D4C /* CodePush.xcodeproj */,
|
||||
FD7121847BA447D8B737F22A /* BVLinearGradient.xcodeproj */,
|
||||
409DA945815C46DEB4F254DB /* RCTVideo.xcodeproj */,
|
||||
);
|
||||
name = Libraries;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
832341B11AAA6A8300B99B32 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
832341B51AAA6A8300B99B32 /* libRCTText.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
83CBB9F61A601CBA00E9B192 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
13B07FAE1A68108700A75B9A /* androidTest */,
|
||||
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
||||
00E356EF1AD99517003FC87E /* androidTestTests */,
|
||||
83CBBA001A601CBA00E9B192 /* Products */,
|
||||
);
|
||||
indentWidth = 2;
|
||||
sourceTree = "<group>";
|
||||
tabWidth = 2;
|
||||
};
|
||||
83CBBA001A601CBA00E9B192 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
13B07F961A680F5B00A75B9A /* androidTest.app */,
|
||||
00E356EE1AD99517003FC87E /* androidTestTests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
00E356ED1AD99517003FC87E /* androidTestTests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "androidTestTests" */;
|
||||
buildPhases = (
|
||||
00E356EA1AD99517003FC87E /* Sources */,
|
||||
00E356EB1AD99517003FC87E /* Frameworks */,
|
||||
00E356EC1AD99517003FC87E /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
00E356F51AD99517003FC87E /* PBXTargetDependency */,
|
||||
);
|
||||
name = androidTestTests;
|
||||
productName = androidTestTests;
|
||||
productReference = 00E356EE1AD99517003FC87E /* androidTestTests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
13B07F861A680F5B00A75B9A /* androidTest */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "androidTest" */;
|
||||
buildPhases = (
|
||||
13B07F871A680F5B00A75B9A /* Sources */,
|
||||
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
||||
13B07F8E1A680F5B00A75B9A /* Resources */,
|
||||
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = androidTest;
|
||||
productName = "Hello World";
|
||||
productReference = 13B07F961A680F5B00A75B9A /* androidTest.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 610;
|
||||
ORGANIZATIONNAME = Facebook;
|
||||
TargetAttributes = {
|
||||
00E356ED1AD99517003FC87E = {
|
||||
CreatedOnToolsVersion = 6.2;
|
||||
TestTargetID = 13B07F861A680F5B00A75B9A;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "androidTest" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 83CBB9F61A601CBA00E9B192;
|
||||
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
|
||||
ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
|
||||
ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
|
||||
ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
|
||||
ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
|
||||
ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
|
||||
ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
|
||||
ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
|
||||
ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
|
||||
ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
|
||||
},
|
||||
{
|
||||
ProductGroup = 146834001AC3E56700842450 /* Products */;
|
||||
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
13B07F861A680F5B00A75B9A /* androidTest */,
|
||||
00E356ED1AD99517003FC87E /* androidTestTests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXReferenceProxy section */
|
||||
00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTActionSheet.a;
|
||||
remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTGeolocation.a;
|
||||
remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTImage.a;
|
||||
remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTNetwork.a;
|
||||
remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTVibration.a;
|
||||
remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTSettings.a;
|
||||
remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTWebSocket.a;
|
||||
remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
146834041AC3E56700842450 /* libReact.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libReact.a;
|
||||
remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTLinking.a;
|
||||
remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
|
||||
isa = PBXReferenceProxy;
|
||||
fileType = archive.ar;
|
||||
path = libRCTText.a;
|
||||
remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
|
||||
sourceTree = BUILT_PRODUCTS_DIR;
|
||||
};
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
00E356EC1AD99517003FC87E /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
||||
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Bundle React Native code and images";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "../node_modules/react-native/scripts/react-native-xcode.sh";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
00E356EA1AD99517003FC87E /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
00E356F31AD99517003FC87E /* androidTestTests.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
13B07F871A680F5B00A75B9A /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
|
||||
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 13B07F861A680F5B00A75B9A /* androidTest */;
|
||||
targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
13B07FB21A68108700A75B9A /* Base */,
|
||||
);
|
||||
name = LaunchScreen.xib;
|
||||
path = androidTest;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
00E356F61AD99517003FC87E /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = androidTestTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidTest.app/androidTest";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
00E356F71AD99517003FC87E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = androidTestTests/Info.plist;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||
);
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/androidTest.app/androidTest";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||
"$(SRCROOT)",
|
||||
"$(SRCROOT)/../node_modules/react-native-code-push",
|
||||
"$(SRCROOT)/../node_modules/react-native-linear-gradient/**",
|
||||
"$(SRCROOT)/../node_modules/react-native-video",
|
||||
);
|
||||
INFOPLIST_FILE = androidTest/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = androidTest;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
13B07F951A680F5B00A75B9A /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||
"$(SRCROOT)",
|
||||
"$(SRCROOT)/../node_modules/react-native-code-push",
|
||||
"$(SRCROOT)/../node_modules/react-native-linear-gradient/**",
|
||||
"$(SRCROOT)/../node_modules/react-native-video",
|
||||
);
|
||||
INFOPLIST_FILE = androidTest/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = androidTest;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||
"$(SRCROOT)",
|
||||
"$(SRCROOT)/../node_modules/react-native-code-push",
|
||||
"$(SRCROOT)/../node_modules/react-native-linear-gradient/**",
|
||||
"$(SRCROOT)/../node_modules/react-native-video",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
83CBBA211A601CBA00E9B192 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||
"$(SRCROOT)",
|
||||
"$(SRCROOT)/../node_modules/react-native-code-push",
|
||||
"$(SRCROOT)/../node_modules/react-native-linear-gradient/**",
|
||||
"$(SRCROOT)/../node_modules/react-native-video",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "androidTestTests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
00E356F61AD99517003FC87E /* Debug */,
|
||||
00E356F71AD99517003FC87E /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "androidTest" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
13B07F941A680F5B00A75B9A /* Debug */,
|
||||
13B07F951A680F5B00A75B9A /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "androidTest" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
83CBBA201A601CBA00E9B192 /* Debug */,
|
||||
83CBBA211A601CBA00E9B192 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
const fs = jest.requireActual('fs');
|
||||
const path = require('path');
|
||||
|
||||
exports.valid = {
|
||||
'demoProject.xcodeproj': {
|
||||
'project.pbxproj': fs.readFileSync(
|
||||
path.join(__dirname, './files/project.pbxproj'),
|
||||
),
|
||||
},
|
||||
'TestPod.podspec': 'empty',
|
||||
};
|
||||
|
||||
exports.validTestName = {
|
||||
'MyTestProject.xcodeproj': {
|
||||
'project.pbxproj': fs.readFileSync(
|
||||
path.join(__dirname, './files/project.pbxproj'),
|
||||
),
|
||||
},
|
||||
};
|
||||
|
||||
exports.pod = {
|
||||
'TestPod.podspec': 'empty',
|
||||
};
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
const android = require('./android');
|
||||
const ios = require('./ios');
|
||||
|
||||
const flat = {
|
||||
android: android.valid,
|
||||
ios: ios.valid,
|
||||
Podfile: 'empty',
|
||||
};
|
||||
|
||||
const nested = {
|
||||
android: {
|
||||
app: android.valid,
|
||||
},
|
||||
ios: ios.valid,
|
||||
};
|
||||
|
||||
const withExamples = {
|
||||
Examples: flat,
|
||||
ios: ios.valid,
|
||||
android: android.valid,
|
||||
};
|
||||
|
||||
const withPods = {
|
||||
Podfile: 'content',
|
||||
ios: ios.pod,
|
||||
};
|
||||
|
||||
module.exports = {flat, nested, withExamples, withPods};
|
||||
@@ -1,43 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const fs = require('fs');
|
||||
const findAndroidAppFolder = require('../../android/findAndroidAppFolder');
|
||||
const mocks = require('../../__fixtures__/android');
|
||||
|
||||
describe('android::findAndroidAppFolder', () => {
|
||||
beforeAll(() => {
|
||||
fs.__setMockFilesystem({
|
||||
empty: {},
|
||||
nested: {
|
||||
android: {
|
||||
app: mocks.valid,
|
||||
},
|
||||
},
|
||||
flat: {
|
||||
android: mocks.valid,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an android app folder if it exists in the given folder', () => {
|
||||
expect(findAndroidAppFolder('/flat')).toBe('android');
|
||||
expect(findAndroidAppFolder('/nested')).toBe('android/app');
|
||||
});
|
||||
|
||||
it('returns `null` if there is no android app folder', () => {
|
||||
expect(findAndroidAppFolder('/empty')).toBeNull();
|
||||
});
|
||||
});
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const findManifest = require('../../android/findManifest');
|
||||
const fs = require('fs');
|
||||
const mocks = require('../../__fixtures__/android');
|
||||
|
||||
describe('android::findManifest', () => {
|
||||
beforeAll(() => {
|
||||
fs.__setMockFilesystem({
|
||||
empty: {},
|
||||
flat: {
|
||||
android: mocks.valid,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('returns a manifest path if file exists in the folder', () => {
|
||||
expect(typeof findManifest('/flat')).toBe('string');
|
||||
});
|
||||
|
||||
it('returns `null` if there is no manifest in the folder', () => {
|
||||
expect(findManifest('/empty')).toBeNull();
|
||||
});
|
||||
});
|
||||
@@ -1,58 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const mocks = require('../../__fixtures__/android');
|
||||
const findPackageClassName = require('../../android/findPackageClassName');
|
||||
const fs = require('fs');
|
||||
|
||||
['posix', 'win32'].forEach(platform => {
|
||||
let root;
|
||||
describe(`android::findPackageClassName (${platform})`, () => {
|
||||
beforeAll(() => {
|
||||
root = fs.__setMockFilesystem(
|
||||
{
|
||||
empty: {},
|
||||
flatJava: {
|
||||
android: mocks.valid,
|
||||
},
|
||||
flatKotlin: {
|
||||
android: mocks.validKotlin,
|
||||
},
|
||||
},
|
||||
platform,
|
||||
);
|
||||
});
|
||||
|
||||
it('returns manifest content if file exists in the folder', () => {
|
||||
expect(typeof findPackageClassName(root + 'flatJava')).toBe('string');
|
||||
});
|
||||
|
||||
it('returns the name of the java class implementing ReactPackage', () => {
|
||||
expect(findPackageClassName(root + 'flatJava')).toBe(
|
||||
'SomeExampleJavaPackage',
|
||||
);
|
||||
});
|
||||
|
||||
it('returns the name of the kotlin class implementing ReactPackage', () => {
|
||||
expect(findPackageClassName(root + 'flatKotlin')).toBe(
|
||||
'SomeExampleKotlinPackage',
|
||||
);
|
||||
});
|
||||
|
||||
it('returns `null` if there are no matches', () => {
|
||||
expect(findPackageClassName(root + 'empty')).toBeNull();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,62 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const getDependencyConfig = require('../../android').dependencyConfig;
|
||||
const fs = require('fs');
|
||||
const mocks = require('../../__fixtures__/android');
|
||||
|
||||
const userConfig = {};
|
||||
|
||||
describe('android::getDependencyConfig', () => {
|
||||
beforeAll(() => {
|
||||
fs.__setMockFilesystem({
|
||||
empty: {},
|
||||
nested: {
|
||||
android: {
|
||||
app: mocks.valid,
|
||||
},
|
||||
},
|
||||
corrupted: {
|
||||
android: {
|
||||
app: mocks.corrupted,
|
||||
},
|
||||
},
|
||||
noPackage: {
|
||||
android: {},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an object with android project configuration', () => {
|
||||
expect(getDependencyConfig('/nested', userConfig)).not.toBeNull();
|
||||
expect(typeof getDependencyConfig('/nested', userConfig)).toBe('object');
|
||||
});
|
||||
|
||||
it('returns `null` if manifest file has not been found', () => {
|
||||
expect(getDependencyConfig('/empty', userConfig)).toBeNull();
|
||||
});
|
||||
|
||||
it('returns `null` if android project was not found', () => {
|
||||
expect(getDependencyConfig('/empty', userConfig)).toBeNull();
|
||||
});
|
||||
|
||||
it('returns `null` if android project does not contain ReactPackage', () => {
|
||||
expect(getDependencyConfig('/noPackage', userConfig)).toBeNull();
|
||||
});
|
||||
|
||||
it('returns `null` if it cannot find a packageClassName', () => {
|
||||
expect(getDependencyConfig('/corrupted', userConfig)).toBeNull();
|
||||
});
|
||||
});
|
||||
@@ -1,89 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const getProjectConfig = require('../../android').projectConfig;
|
||||
const fs = require('fs');
|
||||
const mocks = require('../../__fixtures__/android');
|
||||
|
||||
describe('android::getProjectConfig', () => {
|
||||
beforeAll(() => {
|
||||
fs.__setMockFilesystem({
|
||||
empty: {},
|
||||
nested: {
|
||||
android: {
|
||||
app: mocks.valid,
|
||||
},
|
||||
},
|
||||
flat: {
|
||||
android: mocks.valid,
|
||||
},
|
||||
multiple: {
|
||||
android: mocks.userConfigManifest,
|
||||
},
|
||||
noManifest: {
|
||||
android: {},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it("returns `null` if manifest file hasn't been found and userConfig is not defined", () => {
|
||||
const userConfig = undefined;
|
||||
const folder = '/noManifest';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).toBeNull();
|
||||
});
|
||||
|
||||
it("returns `null` if manifest file hasn't been found", () => {
|
||||
const userConfig = {};
|
||||
const folder = '/noManifest';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).toBeNull();
|
||||
});
|
||||
|
||||
describe('returns an object with android project configuration for', () => {
|
||||
it('nested structure', () => {
|
||||
const userConfig = {};
|
||||
const folder = '/nested';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).not.toBeNull();
|
||||
expect(typeof getProjectConfig(folder, userConfig)).toBe('object');
|
||||
});
|
||||
|
||||
it('flat structure', () => {
|
||||
const userConfig = {};
|
||||
const folder = '/flat';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).not.toBeNull();
|
||||
expect(typeof getProjectConfig(folder, userConfig)).toBe('object');
|
||||
});
|
||||
|
||||
it('multiple', () => {
|
||||
const userConfig = {
|
||||
manifestPath: 'src/main/AndroidManifest.xml',
|
||||
};
|
||||
const folder = '/multiple';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).not.toBeNull();
|
||||
expect(typeof getProjectConfig(folder, userConfig)).toBe('object');
|
||||
});
|
||||
});
|
||||
|
||||
it('should return `null` if android project was not found', () => {
|
||||
const userConfig = {};
|
||||
const folder = '/empty';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).toBeNull();
|
||||
});
|
||||
});
|
||||
@@ -1,45 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const findManifest = require('../../android/findManifest');
|
||||
const readManifest = require('../../android/readManifest');
|
||||
const fs = require('fs');
|
||||
const mocks = require('../../__fixtures__/android');
|
||||
|
||||
describe('android::readManifest', () => {
|
||||
beforeAll(() => {
|
||||
fs.__setMockFilesystem({
|
||||
empty: {},
|
||||
nested: {
|
||||
android: {
|
||||
app: mocks.valid,
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('returns manifest content if file exists in the folder', () => {
|
||||
const manifestPath = findManifest('/nested');
|
||||
expect(readManifest(manifestPath)).not.toBeNull();
|
||||
expect(typeof readManifest(manifestPath)).toBe('object');
|
||||
});
|
||||
|
||||
it('throws an error if there is no manifest in the folder', () => {
|
||||
const fakeManifestPath = findManifest('/empty');
|
||||
expect(() => {
|
||||
readManifest(fakeManifestPath);
|
||||
}).toThrow();
|
||||
});
|
||||
});
|
||||
@@ -1,43 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const findAssets = require('../findAssets');
|
||||
const dependencies = require('../__fixtures__/dependencies');
|
||||
const fs = require('fs');
|
||||
|
||||
describe('findAssets', () => {
|
||||
beforeEach(() => {
|
||||
fs.__setMockFilesystem({testDir: dependencies.withAssets});
|
||||
});
|
||||
|
||||
it('returns an array of all files in given folders', () => {
|
||||
const assets = findAssets('/testDir', ['fonts', 'images']);
|
||||
|
||||
expect(Array.isArray(assets)).toBeTruthy();
|
||||
expect(assets).toHaveLength(3);
|
||||
});
|
||||
|
||||
it('prepends assets paths with the folder path', () => {
|
||||
const assets = findAssets('/testDir', ['fonts', 'images']);
|
||||
|
||||
assets.forEach(assetPath => {
|
||||
expect(assetPath).toContain('testDir');
|
||||
});
|
||||
});
|
||||
|
||||
it('returns an empty array if given assets are null', () => {
|
||||
expect(findAssets('/testDir', null)).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
@@ -1,84 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const findPlugins = require('../findPlugins');
|
||||
const path = require('path');
|
||||
|
||||
const ROOT = path.join(__dirname, '..', '..', '..');
|
||||
const pjsonPath = path.join(ROOT, 'package.json');
|
||||
|
||||
describe('findPlugins', () => {
|
||||
beforeEach(() => {
|
||||
jest.resetModules();
|
||||
});
|
||||
|
||||
it('returns an array of dependencies', () => {
|
||||
jest.mock(pjsonPath, () => ({
|
||||
dependencies: {'rnpm-plugin-test': '*'},
|
||||
}));
|
||||
|
||||
expect(findPlugins([ROOT])).toHaveProperty('commands');
|
||||
expect(findPlugins([ROOT])).toHaveProperty('platforms');
|
||||
expect(findPlugins([ROOT]).commands).toHaveLength(1);
|
||||
expect(findPlugins([ROOT]).commands[0]).toBe('rnpm-plugin-test');
|
||||
expect(findPlugins([ROOT]).platforms).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('returns an empty array if there are no plugins in this folder', () => {
|
||||
jest.mock(pjsonPath, () => ({}));
|
||||
expect(findPlugins([ROOT])).toHaveProperty('commands');
|
||||
expect(findPlugins([ROOT])).toHaveProperty('platforms');
|
||||
expect(findPlugins([ROOT]).commands).toHaveLength(0);
|
||||
expect(findPlugins([ROOT]).platforms).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('returns an object with empty arrays if there is no package.json in the supplied folder', () => {
|
||||
expect(findPlugins(['fake-path'])).toHaveProperty('commands');
|
||||
expect(findPlugins(['fake-path'])).toHaveProperty('platforms');
|
||||
expect(findPlugins(['fake-path']).commands).toHaveLength(0);
|
||||
expect(findPlugins(['fake-path']).platforms).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('returns plugins from both dependencies and dev dependencies', () => {
|
||||
jest.mock(pjsonPath, () => ({
|
||||
dependencies: {'rnpm-plugin-test': '*'},
|
||||
devDependencies: {'rnpm-plugin-test-2': '*'},
|
||||
}));
|
||||
expect(findPlugins([ROOT])).toHaveProperty('commands');
|
||||
expect(findPlugins([ROOT])).toHaveProperty('platforms');
|
||||
expect(findPlugins([ROOT]).commands).toHaveLength(2);
|
||||
expect(findPlugins([ROOT]).platforms).toHaveLength(0);
|
||||
});
|
||||
|
||||
it('returns unique list of plugins', () => {
|
||||
jest.mock(pjsonPath, () => ({
|
||||
dependencies: {'rnpm-plugin-test': '*'},
|
||||
devDependencies: {'rnpm-plugin-test': '*'},
|
||||
}));
|
||||
expect(findPlugins([ROOT]).commands).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('returns plugins in scoped modules', () => {
|
||||
jest.mock(pjsonPath, () => ({
|
||||
dependencies: {
|
||||
'@org/rnpm-plugin-test': '*',
|
||||
'@org/react-native-test': '*',
|
||||
'@react-native/test': '*',
|
||||
'@react-native-org/test': '*',
|
||||
},
|
||||
}));
|
||||
|
||||
expect(findPlugins([ROOT])).toHaveProperty('commands');
|
||||
expect(findPlugins([ROOT])).toHaveProperty('platforms');
|
||||
expect(findPlugins([ROOT]).commands[0]).toBe('@org/rnpm-plugin-test');
|
||||
});
|
||||
});
|
||||
@@ -1,31 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const findPodfilePath = require('../../ios/findPodfilePath');
|
||||
const fs = require('fs');
|
||||
const projects = require('../../__fixtures__/projects');
|
||||
const ios = require('../../__fixtures__/ios');
|
||||
|
||||
describe('ios::findPodfilePath', () => {
|
||||
it('returns null if there is no Podfile', () => {
|
||||
fs.__setMockFilesystem(ios.valid);
|
||||
expect(findPodfilePath('')).toBeNull();
|
||||
});
|
||||
|
||||
it('returns Podfile path if it exists', () => {
|
||||
fs.__setMockFilesystem(projects.withPods);
|
||||
expect(findPodfilePath('/ios')).toContain('Podfile');
|
||||
});
|
||||
});
|
||||
@@ -1,55 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const findPodspecName = require('../../ios/findPodspecName');
|
||||
const fs = require('fs');
|
||||
const projects = require('../../__fixtures__/projects');
|
||||
const ios = require('../../__fixtures__/ios');
|
||||
|
||||
describe('ios::findPodspecName', () => {
|
||||
it('returns null if there is not podspec file', () => {
|
||||
fs.__setMockFilesystem(projects.flat);
|
||||
expect(findPodspecName('')).toBeNull();
|
||||
});
|
||||
|
||||
it('returns podspec name if only one exists', () => {
|
||||
fs.__setMockFilesystem(ios.pod);
|
||||
expect(findPodspecName('/')).toBe('TestPod');
|
||||
});
|
||||
|
||||
it('returns podspec name that match packet directory', () => {
|
||||
fs.__setMockFilesystem({
|
||||
user: {
|
||||
PacketName: {
|
||||
'Another.podspec': 'empty',
|
||||
'PacketName.podspec': 'empty',
|
||||
},
|
||||
},
|
||||
});
|
||||
expect(findPodspecName('/user/PacketName')).toBe('PacketName');
|
||||
});
|
||||
|
||||
it('returns first podspec name if not match in directory', () => {
|
||||
fs.__setMockFilesystem({
|
||||
user: {
|
||||
packet: {
|
||||
'Another.podspec': 'empty',
|
||||
'PacketName.podspec': 'empty',
|
||||
},
|
||||
},
|
||||
});
|
||||
expect(findPodspecName('/user/packet')).toBe('Another');
|
||||
});
|
||||
});
|
||||
@@ -1,94 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const findProject = require('../../ios/findProject');
|
||||
const fs = require('fs');
|
||||
const projects = require('../../__fixtures__/projects');
|
||||
const ios = require('../../__fixtures__/ios');
|
||||
|
||||
describe('ios::findProject', () => {
|
||||
it('returns path to xcodeproj if found', () => {
|
||||
fs.__setMockFilesystem(projects.flat);
|
||||
expect(findProject('/')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('returns null if there are no projects', () => {
|
||||
fs.__setMockFilesystem({testDir: projects});
|
||||
expect(findProject('/')).toBeNull();
|
||||
});
|
||||
|
||||
it('returns ios project regardless of its name', () => {
|
||||
fs.__setMockFilesystem({ios: ios.validTestName});
|
||||
expect(findProject('/')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('ignores node_modules', () => {
|
||||
fs.__setMockFilesystem({node_modules: projects.flat});
|
||||
expect(findProject('/')).toBeNull();
|
||||
});
|
||||
|
||||
it('ignores Pods', () => {
|
||||
fs.__setMockFilesystem({Pods: projects.flat});
|
||||
expect(findProject('/')).toBeNull();
|
||||
});
|
||||
|
||||
it('ignores Pods inside `ios` folder', () => {
|
||||
fs.__setMockFilesystem({
|
||||
ios: {
|
||||
Pods: projects.flat,
|
||||
DemoApp: projects.flat.ios,
|
||||
},
|
||||
});
|
||||
expect(findProject('/')).toBe('ios/DemoApp/demoProject.xcodeproj');
|
||||
});
|
||||
|
||||
it('ignores xcodeproj from example folders', () => {
|
||||
fs.__setMockFilesystem({
|
||||
examples: projects.flat,
|
||||
Examples: projects.flat,
|
||||
example: projects.flat,
|
||||
KeychainExample: projects.flat,
|
||||
Zpp: projects.flat,
|
||||
});
|
||||
|
||||
expect(findProject('/').toLowerCase()).not.toContain('example');
|
||||
});
|
||||
|
||||
it('ignores xcodeproj from sample folders', () => {
|
||||
fs.__setMockFilesystem({
|
||||
samples: projects.flat,
|
||||
Samples: projects.flat,
|
||||
sample: projects.flat,
|
||||
KeychainSample: projects.flat,
|
||||
Zpp: projects.flat,
|
||||
});
|
||||
|
||||
expect(findProject('/').toLowerCase()).not.toContain('sample');
|
||||
});
|
||||
|
||||
it('ignores xcodeproj from test folders at any level', () => {
|
||||
fs.__setMockFilesystem({
|
||||
test: projects.flat,
|
||||
IntegrationTests: projects.flat,
|
||||
tests: projects.flat,
|
||||
Zpp: {
|
||||
tests: projects.flat,
|
||||
src: projects.flat,
|
||||
},
|
||||
});
|
||||
|
||||
expect(findProject('/').toLowerCase()).not.toContain('test');
|
||||
});
|
||||
});
|
||||
@@ -1,52 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
jest.mock('path');
|
||||
jest.mock('fs');
|
||||
|
||||
const getProjectConfig = require('../../ios').projectConfig;
|
||||
const fs = require('fs');
|
||||
const projects = require('../../__fixtures__/projects');
|
||||
|
||||
describe('ios::getProjectConfig', () => {
|
||||
const userConfig = {};
|
||||
|
||||
beforeEach(() => {
|
||||
fs.__setMockFilesystem({testDir: projects});
|
||||
});
|
||||
|
||||
it('returns an object with ios project configuration', () => {
|
||||
const folder = '/testDir/nested';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).not.toBeNull();
|
||||
expect(typeof getProjectConfig(folder, userConfig)).toBe('object');
|
||||
});
|
||||
|
||||
it('returns `null` if ios project was not found', () => {
|
||||
const folder = '/testDir/empty';
|
||||
|
||||
expect(getProjectConfig(folder, userConfig)).toBeNull();
|
||||
});
|
||||
|
||||
it('returns normalized shared library names', () => {
|
||||
const projectConfig = getProjectConfig('/testDir/nested', {
|
||||
sharedLibraries: ['libc++', 'libz.tbd', 'HealthKit', 'HomeKit.framework'],
|
||||
});
|
||||
|
||||
expect(projectConfig.sharedLibraries).toEqual([
|
||||
'libc++.tbd',
|
||||
'libz.tbd',
|
||||
'HealthKit.framework',
|
||||
'HomeKit.framework',
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
let spawnError = false;
|
||||
|
||||
jest.setMock('child_process', {
|
||||
spawn: () => ({
|
||||
on: (event, cb) => cb(spawnError),
|
||||
}),
|
||||
});
|
||||
|
||||
const makeCommand = require('../makeCommand');
|
||||
|
||||
describe('makeCommand', () => {
|
||||
const command = makeCommand('echo');
|
||||
|
||||
it('generates a function around shell command', () => {
|
||||
expect(typeof command).toBe('function');
|
||||
});
|
||||
|
||||
it('throws an error if there is no callback provided', () => {
|
||||
expect(command).toThrow();
|
||||
});
|
||||
|
||||
it('invokes a callback after command execution', () => {
|
||||
const spy = jest.fn();
|
||||
command(spy);
|
||||
expect(spy.mock.calls).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('throws an error if spawn ended up with error', () => {
|
||||
spawnError = true;
|
||||
const cb = jest.fn();
|
||||
expect(() => {
|
||||
command(cb);
|
||||
}).toThrow();
|
||||
});
|
||||
});
|
||||
@@ -1,32 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* @param {String} folder Folder to seek in
|
||||
* @return {String}
|
||||
*/
|
||||
module.exports = function findAndroidAppFolder(folder) {
|
||||
const flat = 'android';
|
||||
const nested = path.join('android', 'app');
|
||||
|
||||
if (fs.existsSync(path.join(folder, nested))) {
|
||||
return nested;
|
||||
}
|
||||
|
||||
if (fs.existsSync(path.join(folder, flat))) {
|
||||
return flat;
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
@@ -1,28 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 glob = require('glob');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* Find an android application path in the folder
|
||||
*
|
||||
* @param {String} folder Name of the folder where to seek
|
||||
* @return {String}
|
||||
*/
|
||||
module.exports = function findManifest(folder) {
|
||||
const manifestPath = glob.sync(path.join('**', 'AndroidManifest.xml'), {
|
||||
cwd: folder,
|
||||
ignore: ['node_modules/**', '**/build/**', 'Examples/**', 'examples/**'],
|
||||
})[0];
|
||||
|
||||
return manifestPath ? path.join(folder, manifestPath) : null;
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 fs = require('fs');
|
||||
const glob = require('glob');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* Gets package's class name (class that implements ReactPackage)
|
||||
* by searching for its declaration in all Java/Kotlin files present in the folder
|
||||
*
|
||||
* @param {String} folder Folder to find java/kt files
|
||||
*/
|
||||
module.exports = function getPackageClassName(folder) {
|
||||
const files = glob.sync('**/+(*.java|*.kt)', {cwd: folder});
|
||||
|
||||
const packages = files
|
||||
.map(filePath => fs.readFileSync(path.join(folder, filePath), 'utf8'))
|
||||
.map(file => file.match(/class (.*) +(implements|:) ReactPackage/))
|
||||
.filter(match => match);
|
||||
|
||||
return packages.length ? packages[0][1] : null;
|
||||
};
|
||||
@@ -1,136 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 findAndroidAppFolder = require('./findAndroidAppFolder');
|
||||
const findManifest = require('./findManifest');
|
||||
const findPackageClassName = require('./findPackageClassName');
|
||||
const path = require('path');
|
||||
const readManifest = require('./readManifest');
|
||||
|
||||
const getPackageName = manifest => manifest.attr.package;
|
||||
|
||||
/**
|
||||
* Gets android project config by analyzing given folder and taking some
|
||||
* defaults specified by user into consideration
|
||||
*/
|
||||
exports.projectConfig = function projectConfigAndroid(folder, userConfig = {}) {
|
||||
const src = userConfig.sourceDir || findAndroidAppFolder(folder);
|
||||
|
||||
if (!src) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const sourceDir = path.join(folder, src);
|
||||
const isFlat = sourceDir.indexOf('app') === -1;
|
||||
const manifestPath = userConfig.manifestPath
|
||||
? path.join(sourceDir, userConfig.manifestPath)
|
||||
: findManifest(sourceDir);
|
||||
|
||||
if (!manifestPath) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const manifest = readManifest(manifestPath);
|
||||
|
||||
const packageName = userConfig.packageName || getPackageName(manifest);
|
||||
|
||||
if (!packageName) {
|
||||
throw new Error(`Package name not found in ${manifestPath}`);
|
||||
}
|
||||
|
||||
const packageFolder =
|
||||
userConfig.packageFolder || packageName.replace(/\./g, path.sep);
|
||||
|
||||
const mainFilePath = path.join(
|
||||
sourceDir,
|
||||
userConfig.mainFilePath ||
|
||||
`src/main/java/${packageFolder}/MainApplication.java`,
|
||||
);
|
||||
|
||||
const stringsPath = path.join(
|
||||
sourceDir,
|
||||
userConfig.stringsPath || 'src/main/res/values/strings.xml',
|
||||
);
|
||||
|
||||
const settingsGradlePath = path.join(
|
||||
folder,
|
||||
'android',
|
||||
userConfig.settingsGradlePath || 'settings.gradle',
|
||||
);
|
||||
|
||||
const assetsPath = path.join(
|
||||
sourceDir,
|
||||
userConfig.assetsPath || 'src/main/assets',
|
||||
);
|
||||
|
||||
const buildGradlePath = path.join(
|
||||
sourceDir,
|
||||
userConfig.buildGradlePath || 'build.gradle',
|
||||
);
|
||||
|
||||
return {
|
||||
sourceDir,
|
||||
isFlat,
|
||||
folder,
|
||||
stringsPath,
|
||||
manifestPath,
|
||||
buildGradlePath,
|
||||
settingsGradlePath,
|
||||
assetsPath,
|
||||
mainFilePath,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Same as projectConfigAndroid except it returns
|
||||
* different config that applies to packages only
|
||||
*/
|
||||
exports.dependencyConfig = function dependencyConfigAndroid(
|
||||
folder,
|
||||
userConfig = {},
|
||||
) {
|
||||
const src = userConfig.sourceDir || findAndroidAppFolder(folder);
|
||||
|
||||
if (!src) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const sourceDir = path.join(folder, src);
|
||||
const manifestPath = userConfig.manifestPath
|
||||
? path.join(sourceDir, userConfig.manifestPath)
|
||||
: findManifest(sourceDir);
|
||||
|
||||
if (!manifestPath) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const manifest = readManifest(manifestPath);
|
||||
const packageName = userConfig.packageName || getPackageName(manifest);
|
||||
const packageClassName = findPackageClassName(sourceDir);
|
||||
|
||||
/**
|
||||
* This module has no package to export
|
||||
*/
|
||||
if (!packageClassName) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const packageImportPath =
|
||||
userConfig.packageImportPath ||
|
||||
`import ${packageName}.${packageClassName};`;
|
||||
|
||||
const packageInstance =
|
||||
userConfig.packageInstance || `new ${packageClassName}()`;
|
||||
|
||||
return {sourceDir, folder, manifest, packageImportPath, packageInstance};
|
||||
};
|
||||
|
||||
exports.linkConfig = require('../../link/android');
|
||||
@@ -1,21 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 fs = require('fs');
|
||||
const xml = require('xmldoc');
|
||||
|
||||
/**
|
||||
* @param {String} manifestPath
|
||||
* @return {XMLDocument} Parsed manifest's content
|
||||
*/
|
||||
module.exports = function readManifest(manifestPath) {
|
||||
return new xml.XmlDocument(fs.readFileSync(manifestPath, 'utf8'));
|
||||
};
|
||||
@@ -1,32 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 glob = require('glob');
|
||||
const path = require('path');
|
||||
|
||||
const findAssetsInFolder = folder =>
|
||||
glob.sync(path.join(folder, '**'), {nodir: true});
|
||||
|
||||
/**
|
||||
* Given an array of assets folders, e.g. ['Fonts', 'Images'],
|
||||
* it globs in them to find all files that can be copied.
|
||||
*
|
||||
* It returns an array of absolute paths to files found.
|
||||
*/
|
||||
module.exports = function findAssets(folder, assets) {
|
||||
return (assets || [])
|
||||
.map(assetsFolder => path.join(folder, assetsFolder))
|
||||
.reduce(
|
||||
(_assets, assetsFolder) =>
|
||||
_assets.concat(findAssetsInFolder(assetsFolder)),
|
||||
[],
|
||||
);
|
||||
};
|
||||
@@ -1,133 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 path = require('path');
|
||||
const union = require('lodash').union;
|
||||
const uniq = require('lodash').uniq;
|
||||
const flatten = require('lodash').flatten;
|
||||
|
||||
const RNPM_PLUGIN_PATTERNS = [/^rnpm-plugin-/, /^@(.*)\/rnpm-plugin-/];
|
||||
|
||||
const REACT_NATIVE_PLUGIN_PATTERNS = [
|
||||
/^react-native-/,
|
||||
/^@(.*)\/react-native-/,
|
||||
/^@react-native(.*)\/(?!rnpm-plugin-)/,
|
||||
];
|
||||
|
||||
/**
|
||||
* Filter dependencies by name pattern
|
||||
* @param {String} dependency Name of the dependency
|
||||
* @return {Boolean} If dependency is a rnpm plugin
|
||||
*/
|
||||
const isRNPMPlugin = dependency =>
|
||||
RNPM_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency));
|
||||
const isReactNativePlugin = dependency =>
|
||||
REACT_NATIVE_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency));
|
||||
|
||||
const readPackage = folder => {
|
||||
try {
|
||||
return require(path.join(folder, 'package.json'));
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const findPluginsInReactNativePackage = pjson => {
|
||||
if (!pjson.rnpm || !pjson.rnpm.plugin) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return path.join(pjson.name, pjson.rnpm.plugin);
|
||||
};
|
||||
|
||||
const findPlatformsInPackage = pjson => {
|
||||
if (!pjson.rnpm || !pjson.rnpm.platform) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return path.join(pjson.name, pjson.rnpm.platform);
|
||||
};
|
||||
|
||||
const getEmptyPluginConfig = () => ({
|
||||
commands: [],
|
||||
platforms: [],
|
||||
haste: {
|
||||
platforms: [],
|
||||
providesModuleNodeModules: [],
|
||||
},
|
||||
});
|
||||
|
||||
const findHasteConfigInPackageAndConcat = (pjson, haste) => {
|
||||
if (!pjson.rnpm || !pjson.rnpm.haste) {
|
||||
return;
|
||||
}
|
||||
let pkgHaste = pjson.rnpm.haste;
|
||||
|
||||
if (pkgHaste.platforms) {
|
||||
haste.platforms = haste.platforms.concat(pkgHaste.platforms);
|
||||
}
|
||||
|
||||
if (pkgHaste.providesModuleNodeModules) {
|
||||
haste.providesModuleNodeModules = haste.providesModuleNodeModules.concat(
|
||||
pkgHaste.providesModuleNodeModules,
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const findPluginInFolder = folder => {
|
||||
const pjson = readPackage(folder);
|
||||
|
||||
if (!pjson) {
|
||||
return getEmptyPluginConfig();
|
||||
}
|
||||
|
||||
const deps = union(
|
||||
Object.keys(pjson.dependencies || {}),
|
||||
Object.keys(pjson.devDependencies || {}),
|
||||
);
|
||||
|
||||
return deps.reduce((acc, pkg) => {
|
||||
let commands = acc.commands;
|
||||
let platforms = acc.platforms;
|
||||
let haste = acc.haste;
|
||||
if (isRNPMPlugin(pkg)) {
|
||||
commands = commands.concat(pkg);
|
||||
}
|
||||
if (isReactNativePlugin(pkg)) {
|
||||
const pkgJson = readPackage(path.join(folder, 'node_modules', pkg));
|
||||
if (pkgJson) {
|
||||
commands = commands.concat(findPluginsInReactNativePackage(pkgJson));
|
||||
platforms = platforms.concat(findPlatformsInPackage(pkgJson));
|
||||
findHasteConfigInPackageAndConcat(pkgJson, haste);
|
||||
}
|
||||
}
|
||||
return {commands: commands, platforms: platforms, haste: haste};
|
||||
}, getEmptyPluginConfig());
|
||||
};
|
||||
|
||||
/**
|
||||
* Find plugins in package.json of the given folder
|
||||
* @param {String} folder Path to the folder to get the package.json from
|
||||
* @type {Object} Object of commands and platform plugins
|
||||
*/
|
||||
module.exports = function findPlugins(folders) {
|
||||
const plugins = folders.map(findPluginInFolder);
|
||||
return {
|
||||
commands: uniq(flatten(plugins.map(p => p.commands))),
|
||||
platforms: uniq(flatten(plugins.map(p => p.platforms))),
|
||||
haste: {
|
||||
platforms: uniq(flatten(plugins.map(p => p.haste.platforms))),
|
||||
providesModuleNodeModules: uniq(
|
||||
flatten(plugins.map(p => p.haste.providesModuleNodeModules)),
|
||||
),
|
||||
},
|
||||
};
|
||||
};
|
||||
@@ -1,170 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @flow
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const android = require('./android');
|
||||
const Config = require('../util/Config');
|
||||
const findPlugins = require('./findPlugins');
|
||||
const findAssets = require('./findAssets');
|
||||
const ios = require('./ios');
|
||||
const wrapCommands = require('./wrapCommands');
|
||||
const {ASSET_REGISTRY_PATH} = require('./Constants');
|
||||
|
||||
const flatten = require('lodash').flatten;
|
||||
const minimist = require('minimist');
|
||||
const path = require('path');
|
||||
|
||||
import type {CommandT} from '../commands';
|
||||
import type {ConfigT} from 'metro-config/src/configTypes.flow';
|
||||
|
||||
export type RNConfig = {
|
||||
...ConfigT,
|
||||
/**
|
||||
* Returns an object with all platform configurations.
|
||||
*/
|
||||
getPlatformConfig(): Object,
|
||||
/**
|
||||
* Returns project config from the current working directory
|
||||
*/
|
||||
getProjectConfig(): Object,
|
||||
/**
|
||||
* Returns dependency config from <node_modules>/packageName
|
||||
*/
|
||||
getDependencyConfig(pkgName: string): Object,
|
||||
};
|
||||
|
||||
const getRNPMConfig = folder =>
|
||||
// $FlowFixMe non-literal require
|
||||
require(path.join(folder, './package.json')).rnpm || {};
|
||||
|
||||
const attachPackage = (command, pkg) =>
|
||||
Array.isArray(command)
|
||||
? command.map(cmd => attachPackage(cmd, pkg))
|
||||
: {...command, pkg};
|
||||
|
||||
const appRoot = process.cwd();
|
||||
const plugins = findPlugins([appRoot]);
|
||||
const pluginPlatforms = plugins.platforms.reduce((acc, pathToPlatforms) => {
|
||||
return Object.assign(
|
||||
acc,
|
||||
// $FlowFixMe non-literal require
|
||||
require(path.join(appRoot, 'node_modules', pathToPlatforms)),
|
||||
);
|
||||
}, {});
|
||||
|
||||
const defaultConfig = {
|
||||
hasteImplModulePath: require.resolve('../../jest/hasteImpl'),
|
||||
|
||||
getPlatforms(): Array<string> {
|
||||
return ['ios', 'android', 'native', ...plugins.haste.platforms];
|
||||
},
|
||||
|
||||
getProvidesModuleNodeModules(): Array<string> {
|
||||
return ['react-native', ...plugins.haste.providesModuleNodeModules];
|
||||
},
|
||||
};
|
||||
|
||||
const defaultRNConfig = {
|
||||
getPlatformConfig(): Object {
|
||||
return {
|
||||
ios,
|
||||
android,
|
||||
...pluginPlatforms,
|
||||
};
|
||||
},
|
||||
|
||||
getProjectConfig(): Object {
|
||||
const platforms = this.getPlatformConfig();
|
||||
const folder = process.cwd();
|
||||
const rnpm = getRNPMConfig(folder);
|
||||
|
||||
let config = Object.assign({}, rnpm, {
|
||||
assets: findAssets(folder, rnpm.assets),
|
||||
});
|
||||
|
||||
Object.keys(platforms).forEach(key => {
|
||||
config[key] = platforms[key].projectConfig(folder, rnpm[key] || {});
|
||||
});
|
||||
|
||||
return config;
|
||||
},
|
||||
|
||||
getDependencyConfig(packageName: string) {
|
||||
const platforms = this.getPlatformConfig();
|
||||
const folder = path.join(process.cwd(), 'node_modules', packageName);
|
||||
const rnpm = getRNPMConfig(folder);
|
||||
|
||||
let config = Object.assign({}, rnpm, {
|
||||
assets: findAssets(folder, rnpm.assets),
|
||||
commands: wrapCommands(rnpm.commands),
|
||||
params: rnpm.params || [],
|
||||
});
|
||||
|
||||
Object.keys(platforms).forEach(key => {
|
||||
config[key] = platforms[key].dependencyConfig(folder, rnpm[key] || {});
|
||||
});
|
||||
|
||||
return config;
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Loads the CLI configuration
|
||||
*/
|
||||
async function getCliConfig(): Promise<RNConfig> {
|
||||
const cliArgs = minimist(process.argv.slice(2));
|
||||
const config = await Config.load(
|
||||
typeof cliArgs.config === 'string'
|
||||
? path.resolve(__dirname, cliArgs.config)
|
||||
: null,
|
||||
);
|
||||
|
||||
// $FlowFixMe Metro configuration is immutable.
|
||||
config.transformer.assetRegistryPath = ASSET_REGISTRY_PATH;
|
||||
config.resolver.hasteImplModulePath =
|
||||
config.resolver.hasteImplModulePath || defaultConfig.hasteImplModulePath;
|
||||
config.resolver.platforms = config.resolver.platforms
|
||||
? config.resolver.platforms.concat(defaultConfig.getPlatforms())
|
||||
: defaultConfig.getPlatforms();
|
||||
config.resolver.providesModuleNodeModules = config.resolver
|
||||
.providesModuleNodeModules
|
||||
? config.resolver.providesModuleNodeModules.concat(
|
||||
defaultConfig.getProvidesModuleNodeModules(),
|
||||
)
|
||||
: defaultConfig.getProvidesModuleNodeModules();
|
||||
|
||||
return {...defaultRNConfig, ...config};
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of project commands used by the CLI to load
|
||||
*/
|
||||
function getProjectCommands(): Array<CommandT> {
|
||||
const commands = plugins.commands.map(pathToCommands => {
|
||||
const name =
|
||||
pathToCommands[0] === '@'
|
||||
? pathToCommands
|
||||
.split(path.sep)
|
||||
.slice(0, 2)
|
||||
.join(path.sep)
|
||||
: pathToCommands.split(path.sep)[0];
|
||||
|
||||
return attachPackage(
|
||||
require(path.join(appRoot, 'node_modules', pathToCommands)),
|
||||
require(path.join(appRoot, 'node_modules', name, 'package.json')),
|
||||
);
|
||||
});
|
||||
|
||||
return flatten(commands);
|
||||
}
|
||||
|
||||
module.exports.configPromise = getCliConfig();
|
||||
module.exports.getProjectCommands = getProjectCommands;
|
||||
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = function findPodfilePath(projectFolder) {
|
||||
const podFilePath = path.join(projectFolder, '..', 'Podfile');
|
||||
const podFileExists = fs.existsSync(podFilePath);
|
||||
|
||||
return podFileExists ? podFilePath : null;
|
||||
};
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 glob = require('glob');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = function findPodspecName(folder) {
|
||||
const podspecs = glob.sync('*.podspec', {cwd: folder});
|
||||
let podspecFile = null;
|
||||
if (podspecs.length === 0) {
|
||||
return null;
|
||||
} else if (podspecs.length === 1) {
|
||||
podspecFile = podspecs[0];
|
||||
} else {
|
||||
const folderParts = folder.split(path.sep);
|
||||
const currentFolder = folderParts[folderParts.length - 1];
|
||||
const toSelect = podspecs.indexOf(currentFolder + '.podspec');
|
||||
if (toSelect === -1) {
|
||||
podspecFile = podspecs[0];
|
||||
} else {
|
||||
podspecFile = podspecs[toSelect];
|
||||
}
|
||||
}
|
||||
|
||||
return podspecFile.replace('.podspec', '');
|
||||
};
|
||||
@@ -1,61 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 glob = require('glob');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* Glob pattern to look for xcodeproj
|
||||
*/
|
||||
const GLOB_PATTERN = '**/*.xcodeproj';
|
||||
|
||||
/**
|
||||
* Regexp matching all test projects
|
||||
*/
|
||||
const TEST_PROJECTS = /test|example|sample/i;
|
||||
|
||||
/**
|
||||
* Base iOS folder
|
||||
*/
|
||||
const IOS_BASE = 'ios';
|
||||
|
||||
/**
|
||||
* These folders will be excluded from search to speed it up
|
||||
*/
|
||||
const GLOB_EXCLUDE_PATTERN = ['**/@(Pods|node_modules)/**'];
|
||||
|
||||
/**
|
||||
* Finds iOS project by looking for all .xcodeproj files
|
||||
* in given folder.
|
||||
*
|
||||
* Returns first match if files are found or null
|
||||
*
|
||||
* Note: `./ios/*.xcodeproj` are returned regardless of the name
|
||||
*/
|
||||
module.exports = function findProject(folder) {
|
||||
const projects = glob
|
||||
.sync(GLOB_PATTERN, {
|
||||
cwd: folder,
|
||||
ignore: GLOB_EXCLUDE_PATTERN,
|
||||
})
|
||||
.filter(project => {
|
||||
return path.dirname(project) === IOS_BASE || !TEST_PROJECTS.test(project);
|
||||
})
|
||||
.sort((projectA, projectB) => {
|
||||
return path.dirname(projectA) === IOS_BASE ? -1 : 1;
|
||||
});
|
||||
|
||||
if (projects.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return projects[0];
|
||||
};
|
||||
@@ -1,62 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 findProject = require('./findProject');
|
||||
const findPodfilePath = require('./findPodfilePath');
|
||||
const findPodspecName = require('./findPodspecName');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* For libraries specified without an extension, add '.tbd' for those that
|
||||
* start with 'lib' and '.framework' to the rest.
|
||||
*/
|
||||
const mapSharedLibaries = libraries => {
|
||||
return libraries.map(name => {
|
||||
if (path.extname(name)) {
|
||||
return name;
|
||||
}
|
||||
return name + (name.indexOf('lib') === 0 ? '.tbd' : '.framework');
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns project config by analyzing given folder and applying some user defaults
|
||||
* when constructing final object
|
||||
*/
|
||||
exports.projectConfig = function projectConfigIOS(folder, userConfig) {
|
||||
const project = userConfig.project || findProject(folder);
|
||||
|
||||
/**
|
||||
* No iOS config found here
|
||||
*/
|
||||
if (!project) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const projectPath = path.join(folder, project);
|
||||
|
||||
return {
|
||||
sourceDir: path.dirname(projectPath),
|
||||
folder: folder,
|
||||
pbxprojPath: path.join(projectPath, 'project.pbxproj'),
|
||||
podfile: findPodfilePath(projectPath),
|
||||
podspec: findPodspecName(folder),
|
||||
projectPath: projectPath,
|
||||
projectName: path.basename(projectPath),
|
||||
libraryFolder: userConfig.libraryFolder || 'Libraries',
|
||||
sharedLibraries: mapSharedLibaries(userConfig.sharedLibraries || []),
|
||||
plist: userConfig.plist || [],
|
||||
};
|
||||
};
|
||||
|
||||
exports.dependencyConfig = exports.projectConfig;
|
||||
|
||||
exports.linkConfig = require('../../link/ios');
|
||||
@@ -1,38 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 spawn = require('child_process').spawn;
|
||||
|
||||
module.exports = function makeCommand(command) {
|
||||
return cb => {
|
||||
if (!cb) {
|
||||
throw new Error(
|
||||
`You missed a callback function for the ${command} command`,
|
||||
);
|
||||
}
|
||||
|
||||
const args = command.split(' ');
|
||||
const cmd = args.shift();
|
||||
|
||||
const commandProcess = spawn(cmd, args, {
|
||||
stdio: 'inherit',
|
||||
stdin: 'inherit',
|
||||
});
|
||||
|
||||
commandProcess.on('close', function prelink(code) {
|
||||
if (code) {
|
||||
throw new Error(`Error occurred during executing "${command}" command`);
|
||||
}
|
||||
|
||||
cb();
|
||||
});
|
||||
};
|
||||
};
|
||||
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 makeCommand = require('./makeCommand');
|
||||
|
||||
module.exports = function wrapCommands(commands) {
|
||||
const mappedCommands = {};
|
||||
Object.keys(commands || []).forEach(k => {
|
||||
mappedCommands[k] = makeCommand(commands[k]);
|
||||
});
|
||||
return mappedCommands;
|
||||
};
|
||||
@@ -1,111 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 = [];
|
||||
|
||||
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;
|
||||
|
||||
const deps = packagerInstance
|
||||
? await packagerInstance.getOrderedDependencyPaths(options)
|
||||
: await Metro.getOrderedDependencyPaths(config, options);
|
||||
|
||||
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,
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -1,111 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 copyProjectTemplateAndReplace = require('../generator/copyProjectTemplateAndReplace');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
/**
|
||||
* The eject command re-creates the `android` and `ios` native folders. Because native code can be
|
||||
* difficult to maintain, this new script allows an `app.json` to be defined for the project, which
|
||||
* is used to configure the native app.
|
||||
*
|
||||
* The `app.json` config may contain the following keys:
|
||||
*
|
||||
* - `name` - The short name used for the project, should be TitleCase
|
||||
* - `displayName` - The app's name on the home screen
|
||||
*/
|
||||
|
||||
function eject() {
|
||||
const doesIOSExist = fs.existsSync(path.resolve('ios'));
|
||||
const doesAndroidExist = fs.existsSync(path.resolve('android'));
|
||||
if (doesIOSExist && doesAndroidExist) {
|
||||
console.error(
|
||||
'Both the iOS and Android folders already exist! Please delete `ios` and/or `android` ' +
|
||||
'before ejecting.',
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
let appConfig = null;
|
||||
try {
|
||||
appConfig = require(path.resolve('app.json'));
|
||||
} catch (e) {
|
||||
console.error(
|
||||
'Eject requires an `app.json` config file to be located at ' +
|
||||
`${path.resolve(
|
||||
'app.json',
|
||||
)}, and it must at least specify a \`name\` for the project ` +
|
||||
"name, and a `displayName` for the app's home screen label.",
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const appName = appConfig.name;
|
||||
if (!appName) {
|
||||
console.error(
|
||||
'App `name` must be defined in the `app.json` config file to define the project name. ' +
|
||||
'It must not contain any spaces or dashes.',
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
const displayName = appConfig.displayName;
|
||||
if (!displayName) {
|
||||
console.error(
|
||||
'App `displayName` must be defined in the `app.json` config file, to define the label ' +
|
||||
'of the app on the home screen.',
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const templateOptions = {displayName};
|
||||
|
||||
if (!doesIOSExist) {
|
||||
console.log('Generating the iOS folder.');
|
||||
copyProjectTemplateAndReplace(
|
||||
path.resolve(
|
||||
'node_modules',
|
||||
'react-native',
|
||||
'local-cli',
|
||||
'templates',
|
||||
'HelloWorld',
|
||||
'ios',
|
||||
),
|
||||
path.resolve('ios'),
|
||||
appName,
|
||||
templateOptions,
|
||||
);
|
||||
}
|
||||
|
||||
if (!doesAndroidExist) {
|
||||
console.log('Generating the Android folder.');
|
||||
copyProjectTemplateAndReplace(
|
||||
path.resolve(
|
||||
'node_modules',
|
||||
'react-native',
|
||||
'local-cli',
|
||||
'templates',
|
||||
'HelloWorld',
|
||||
'android',
|
||||
),
|
||||
path.resolve('android'),
|
||||
appName,
|
||||
templateOptions,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'eject',
|
||||
description: 'Re-create the iOS and Android folders and native code',
|
||||
func: eject,
|
||||
options: [],
|
||||
};
|
||||
@@ -1,178 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 chalk = require('chalk');
|
||||
const copyAndReplace = require('../util/copyAndReplace');
|
||||
const path = require('path');
|
||||
const prompt = require('./promptSync')();
|
||||
const walk = require('../util/walk');
|
||||
|
||||
/**
|
||||
* Util for creating a new React Native project.
|
||||
* Copy the project from a template and use the correct project name in
|
||||
* all files.
|
||||
* @param srcPath e.g. '/Users/martin/AwesomeApp/node_modules/react-native/local-cli/templates/HelloWorld'
|
||||
* @param destPath e.g. '/Users/martin/AwesomeApp'
|
||||
* @param newProjectName e.g. 'AwesomeApp'
|
||||
* @param options e.g. {
|
||||
* upgrade: true,
|
||||
* force: false,
|
||||
* displayName: 'Hello World',
|
||||
* ignorePaths: ['template/file/to/ignore.md'],
|
||||
* }
|
||||
*/
|
||||
function copyProjectTemplateAndReplace(
|
||||
srcPath,
|
||||
destPath,
|
||||
newProjectName,
|
||||
options,
|
||||
) {
|
||||
if (!srcPath) {
|
||||
throw new Error('Need a path to copy from');
|
||||
}
|
||||
if (!destPath) {
|
||||
throw new Error('Need a path to copy to');
|
||||
}
|
||||
if (!newProjectName) {
|
||||
throw new Error('Need a project name');
|
||||
}
|
||||
|
||||
options = options || {};
|
||||
|
||||
walk(srcPath).forEach(absoluteSrcFilePath => {
|
||||
// 'react-native upgrade'
|
||||
if (options.upgrade) {
|
||||
// Don't upgrade these files
|
||||
const fileName = path.basename(absoluteSrcFilePath);
|
||||
// This also includes __tests__/index.*.js
|
||||
if (fileName === 'index.ios.js') {
|
||||
return;
|
||||
}
|
||||
if (fileName === 'index.android.js') {
|
||||
return;
|
||||
}
|
||||
if (fileName === 'index.js') {
|
||||
return;
|
||||
}
|
||||
if (fileName === 'App.js') {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const relativeFilePath = path.relative(srcPath, absoluteSrcFilePath);
|
||||
const relativeRenamedPath = translateFilePath(relativeFilePath)
|
||||
.replace(/HelloWorld/g, newProjectName)
|
||||
.replace(/helloworld/g, newProjectName.toLowerCase());
|
||||
|
||||
// Templates may contain files that we don't want to copy.
|
||||
// Examples:
|
||||
// - Dummy package.json file included in the template only for publishing to npm
|
||||
// - Docs specific to the template (.md files)
|
||||
if (options.ignorePaths) {
|
||||
if (!Array.isArray(options.ignorePaths)) {
|
||||
throw new Error('options.ignorePaths must be an array');
|
||||
}
|
||||
if (
|
||||
options.ignorePaths.some(ignorePath => ignorePath === relativeFilePath)
|
||||
) {
|
||||
// Skip copying this file
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let contentChangedCallback = null;
|
||||
if (options.upgrade && !options.force) {
|
||||
contentChangedCallback = (_, contentChanged) => {
|
||||
return upgradeFileContentChangedCallback(
|
||||
absoluteSrcFilePath,
|
||||
relativeRenamedPath,
|
||||
contentChanged,
|
||||
);
|
||||
};
|
||||
}
|
||||
copyAndReplace(
|
||||
absoluteSrcFilePath,
|
||||
path.resolve(destPath, relativeRenamedPath),
|
||||
{
|
||||
'Hello App Display Name': options.displayName || newProjectName,
|
||||
HelloWorld: newProjectName,
|
||||
helloworld: newProjectName.toLowerCase(),
|
||||
},
|
||||
contentChangedCallback,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* There are various files in the templates folder in the RN repo. We want
|
||||
* these to be ignored by tools when working with React Native itself.
|
||||
* Example: _babelrc file is ignored by Babel, renamed to .babelrc inside
|
||||
* a real app folder.
|
||||
* This is especially important for .gitignore because npm has some special
|
||||
* behavior of automatically renaming .gitignore to .npmignore.
|
||||
*/
|
||||
function translateFilePath(path) {
|
||||
if (!path) {
|
||||
return path;
|
||||
}
|
||||
return path
|
||||
.replace('_BUCK', 'BUCK')
|
||||
.replace('_gitignore', '.gitignore')
|
||||
.replace('_gitattributes', '.gitattributes')
|
||||
.replace('_babelrc', '.babelrc')
|
||||
.replace('_flowconfig', '.flowconfig')
|
||||
.replace('_buckconfig', '.buckconfig')
|
||||
.replace('_watchmanconfig', '.watchmanconfig');
|
||||
}
|
||||
|
||||
function upgradeFileContentChangedCallback(
|
||||
absoluteSrcFilePath,
|
||||
relativeDestPath,
|
||||
contentChanged,
|
||||
) {
|
||||
if (contentChanged === 'new') {
|
||||
console.log(chalk.bold('new') + ' ' + relativeDestPath);
|
||||
return 'overwrite';
|
||||
} else if (contentChanged === 'changed') {
|
||||
console.log(
|
||||
chalk.bold(relativeDestPath) +
|
||||
' ' +
|
||||
'has changed in the new version.\nDo you want to keep your ' +
|
||||
relativeDestPath +
|
||||
' or replace it with the ' +
|
||||
'latest version?\nIf you ever made any changes ' +
|
||||
"to this file, you'll probably want to keep it.\n" +
|
||||
'You can see the new version here: ' +
|
||||
absoluteSrcFilePath +
|
||||
'\n' +
|
||||
'Do you want to replace ' +
|
||||
relativeDestPath +
|
||||
'? ' +
|
||||
'Answer y to replace, n to keep your version: ',
|
||||
);
|
||||
const answer = prompt();
|
||||
if (answer === 'y') {
|
||||
console.log('Replacing ' + relativeDestPath);
|
||||
return 'overwrite';
|
||||
} else {
|
||||
console.log('Keeping your ' + relativeDestPath);
|
||||
return 'keep';
|
||||
}
|
||||
} else if (contentChanged === 'identical') {
|
||||
return 'keep';
|
||||
} else {
|
||||
throw new Error(
|
||||
`Unknown file changed state: ${relativeDestPath}, ${contentChanged}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = copyProjectTemplateAndReplace;
|
||||
@@ -1,39 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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';
|
||||
|
||||
var chalk = require('chalk');
|
||||
var path = require('path');
|
||||
|
||||
function printRunInstructions(projectDir, projectName) {
|
||||
const absoluteProjectDir = path.resolve(projectDir);
|
||||
// iOS
|
||||
const xcodeProjectPath =
|
||||
path.resolve(projectDir, 'ios', projectName) + '.xcodeproj';
|
||||
const relativeXcodeProjectPath = path.relative(
|
||||
process.cwd(),
|
||||
xcodeProjectPath,
|
||||
);
|
||||
console.log(chalk.white.bold('To run your app on iOS:'));
|
||||
console.log(' cd ' + absoluteProjectDir);
|
||||
console.log(' react-native run-ios');
|
||||
console.log(' - or -');
|
||||
console.log(' Open ' + relativeXcodeProjectPath + ' in Xcode');
|
||||
console.log(' Hit the Run button');
|
||||
// Android
|
||||
console.log(chalk.white.bold('To run your app on Android:'));
|
||||
console.log(' cd ' + absoluteProjectDir);
|
||||
console.log(
|
||||
' Have an Android emulator running (quickest way to get started), or a device connected',
|
||||
);
|
||||
console.log(' react-native run-android');
|
||||
}
|
||||
|
||||
module.exports = printRunInstructions;
|
||||
@@ -1,144 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
|
||||
// Simplified version of:
|
||||
// https://github.com/0x00A/prompt-sync/blob/master/index.js
|
||||
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var term = 13; // carriage return
|
||||
|
||||
function create() {
|
||||
return prompt;
|
||||
|
||||
function prompt(ask, value, opts) {
|
||||
var insert = 0;
|
||||
opts = opts || {};
|
||||
|
||||
if (Object(ask) === ask) {
|
||||
opts = ask;
|
||||
ask = opts.ask;
|
||||
} else if (Object(value) === value) {
|
||||
opts = value;
|
||||
value = opts.value;
|
||||
}
|
||||
ask = ask || '';
|
||||
var echo = opts.echo;
|
||||
var masked = 'echo' in opts;
|
||||
|
||||
var fd =
|
||||
process.platform === 'win32'
|
||||
? process.stdin.fd
|
||||
: fs.openSync('/dev/tty', 'rs');
|
||||
|
||||
var wasRaw = process.stdin.isRaw;
|
||||
if (!wasRaw) {
|
||||
process.stdin.setRawMode(true);
|
||||
}
|
||||
|
||||
var buf = Buffer.alloc(3);
|
||||
var str = '',
|
||||
character,
|
||||
read;
|
||||
|
||||
if (ask) {
|
||||
process.stdout.write(ask);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
read = fs.readSync(fd, buf, 0, 3);
|
||||
if (read > 1) {
|
||||
// received a control sequence
|
||||
if (buf.toString()) {
|
||||
str = str + buf.toString();
|
||||
str = str.replace(/\0/g, '');
|
||||
insert = str.length;
|
||||
process.stdout.write('\u001b[2K\u001b[0G' + ask + str);
|
||||
process.stdout.write('\u001b[' + (insert + ask.length + 1) + 'G');
|
||||
buf = Buffer.alloc(3);
|
||||
}
|
||||
continue; // any other 3 character sequence is ignored
|
||||
}
|
||||
|
||||
// if it is not a control character seq, assume only one character is read
|
||||
character = buf[read - 1];
|
||||
|
||||
// catch a ^C and return null
|
||||
if (character === 3) {
|
||||
process.stdout.write('^C\n');
|
||||
fs.closeSync(fd);
|
||||
process.exit(130);
|
||||
process.stdin.setRawMode(wasRaw);
|
||||
return null;
|
||||
}
|
||||
|
||||
// catch the terminating character
|
||||
if (character === term) {
|
||||
fs.closeSync(fd);
|
||||
break;
|
||||
}
|
||||
|
||||
if (
|
||||
character === 127 ||
|
||||
(process.platform === 'win32' && character === 8)
|
||||
) {
|
||||
//backspace
|
||||
if (!insert) {
|
||||
continue;
|
||||
}
|
||||
str = str.slice(0, insert - 1) + str.slice(insert);
|
||||
insert--;
|
||||
process.stdout.write('\u001b[2D');
|
||||
} else {
|
||||
if (character < 32 || character > 126) {
|
||||
continue;
|
||||
}
|
||||
str =
|
||||
str.slice(0, insert) +
|
||||
String.fromCharCode(character) +
|
||||
str.slice(insert);
|
||||
insert++;
|
||||
}
|
||||
|
||||
if (masked) {
|
||||
process.stdout.write(
|
||||
'\u001b[2K\u001b[0G' + ask + Array(str.length + 1).join(echo),
|
||||
);
|
||||
} else {
|
||||
process.stdout.write('\u001b[s');
|
||||
if (insert === str.length) {
|
||||
process.stdout.write('\u001b[2K\u001b[0G' + ask + str);
|
||||
} else {
|
||||
if (ask) {
|
||||
process.stdout.write('\u001b[2K\u001b[0G' + ask + str);
|
||||
} else {
|
||||
process.stdout.write(
|
||||
'\u001b[2K\u001b[0G' +
|
||||
str +
|
||||
'\u001b[' +
|
||||
(str.length - insert) +
|
||||
'D',
|
||||
);
|
||||
}
|
||||
}
|
||||
process.stdout.write('\u001b[u');
|
||||
process.stdout.write('\u001b[1C');
|
||||
}
|
||||
}
|
||||
|
||||
process.stdout.write('\n');
|
||||
|
||||
process.stdin.setRawMode(wasRaw);
|
||||
|
||||
return str || value || '';
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = create;
|
||||
@@ -1,199 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 copyProjectTemplateAndReplace = require('./copyProjectTemplateAndReplace');
|
||||
const execSync = require('child_process').execSync;
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* @param destPath Create the new project at this path.
|
||||
* @param newProjectName For example 'AwesomeApp'.
|
||||
* @param template Template to use, for example 'navigation'.
|
||||
* @param yarnVersion Version of yarn available on the system, or null if
|
||||
* yarn is not available. For example '0.18.1'.
|
||||
*/
|
||||
function createProjectFromTemplate(
|
||||
destPath,
|
||||
newProjectName,
|
||||
template,
|
||||
yarnVersion,
|
||||
) {
|
||||
// Expand the basic 'HelloWorld' template
|
||||
copyProjectTemplateAndReplace(
|
||||
path.resolve(
|
||||
'node_modules',
|
||||
'react-native',
|
||||
'local-cli',
|
||||
'templates',
|
||||
'HelloWorld',
|
||||
),
|
||||
destPath,
|
||||
newProjectName,
|
||||
);
|
||||
|
||||
if (template === undefined) {
|
||||
// No specific template, use just the HelloWorld template above
|
||||
return;
|
||||
}
|
||||
|
||||
// Keep the files from the 'HelloWorld' template, and overwrite some of them
|
||||
// with the specified project template.
|
||||
// The 'HelloWorld' template contains the native files (these are used by
|
||||
// all templates) and every other template only contains additional JS code.
|
||||
// Reason:
|
||||
// This way we don't have to duplicate the native files in every template.
|
||||
// If we duplicated them we'd make RN larger and risk that people would
|
||||
// forget to maintain all the copies so they would go out of sync.
|
||||
createFromRemoteTemplate(template, destPath, newProjectName, yarnVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* The following formats are supported for the template:
|
||||
* - 'demo' -> Fetch the package react-native-template-demo from npm
|
||||
* - git://..., http://..., file://... or any other URL supported by npm
|
||||
*/
|
||||
function createFromRemoteTemplate(
|
||||
template,
|
||||
destPath,
|
||||
newProjectName,
|
||||
yarnVersion,
|
||||
) {
|
||||
let installPackage;
|
||||
let templateName;
|
||||
if (template.includes('://')) {
|
||||
// URL, e.g. git://, file://
|
||||
installPackage = template;
|
||||
templateName = template.substr(template.lastIndexOf('/') + 1);
|
||||
} else {
|
||||
// e.g 'demo'
|
||||
installPackage = 'react-native-template-' + template;
|
||||
templateName = installPackage;
|
||||
}
|
||||
|
||||
// Check if the template exists
|
||||
console.log(`Fetching template ${installPackage}...`);
|
||||
try {
|
||||
if (yarnVersion) {
|
||||
execSync(`yarn add ${installPackage} --ignore-scripts`, {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
} else {
|
||||
execSync(
|
||||
`npm install ${installPackage} --save --save-exact --ignore-scripts`,
|
||||
{stdio: 'inherit'},
|
||||
);
|
||||
}
|
||||
const templatePath = path.resolve('node_modules', templateName);
|
||||
copyProjectTemplateAndReplace(templatePath, destPath, newProjectName, {
|
||||
// Every template contains a dummy package.json file included
|
||||
// only for publishing the template to npm.
|
||||
// We want to ignore this dummy file, otherwise it would overwrite
|
||||
// our project's package.json file.
|
||||
ignorePaths: [
|
||||
'package.json',
|
||||
'dependencies.json',
|
||||
'devDependencies.json',
|
||||
],
|
||||
});
|
||||
installTemplateDependencies(templatePath, yarnVersion);
|
||||
installTemplateDevDependencies(templatePath, yarnVersion);
|
||||
} finally {
|
||||
// Clean up the temp files
|
||||
try {
|
||||
if (yarnVersion) {
|
||||
execSync(`yarn remove ${templateName} --ignore-scripts`);
|
||||
} else {
|
||||
execSync(`npm uninstall ${templateName} --ignore-scripts`);
|
||||
}
|
||||
} catch (err) {
|
||||
// Not critical but we still want people to know and report
|
||||
// if this the clean up fails.
|
||||
console.warn(
|
||||
`Failed to clean up template temp files in node_modules/${templateName}. ` +
|
||||
'This is not a critical error, you can work on your app.',
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function installTemplateDependencies(templatePath, yarnVersion) {
|
||||
// dependencies.json is a special file that lists additional dependencies
|
||||
// that are required by this template
|
||||
const dependenciesJsonPath = path.resolve(templatePath, 'dependencies.json');
|
||||
console.log('Adding dependencies for the project...');
|
||||
if (!fs.existsSync(dependenciesJsonPath)) {
|
||||
console.log('No additional dependencies.');
|
||||
return;
|
||||
}
|
||||
|
||||
let dependencies;
|
||||
try {
|
||||
dependencies = JSON.parse(fs.readFileSync(dependenciesJsonPath));
|
||||
} catch (err) {
|
||||
throw new Error(
|
||||
"Could not parse the template's dependencies.json: " + err.message,
|
||||
);
|
||||
}
|
||||
for (let depName in dependencies) {
|
||||
const depVersion = dependencies[depName];
|
||||
const depToInstall = depName + '@' + depVersion;
|
||||
console.log('Adding ' + depToInstall + '...');
|
||||
if (yarnVersion) {
|
||||
execSync(`yarn add ${depToInstall}`, {stdio: 'inherit'});
|
||||
} else {
|
||||
execSync(`npm install ${depToInstall} --save --save-exact`, {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
}
|
||||
console.log("Linking native dependencies into the project's build files...");
|
||||
execSync('react-native link', {stdio: 'inherit'});
|
||||
}
|
||||
|
||||
function installTemplateDevDependencies(templatePath, yarnVersion) {
|
||||
// devDependencies.json is a special file that lists additional develop dependencies
|
||||
// that are required by this template
|
||||
const devDependenciesJsonPath = path.resolve(
|
||||
templatePath,
|
||||
'devDependencies.json',
|
||||
);
|
||||
console.log('Adding develop dependencies for the project...');
|
||||
if (!fs.existsSync(devDependenciesJsonPath)) {
|
||||
console.log('No additional develop dependencies.');
|
||||
return;
|
||||
}
|
||||
|
||||
let dependencies;
|
||||
try {
|
||||
dependencies = JSON.parse(fs.readFileSync(devDependenciesJsonPath));
|
||||
} catch (err) {
|
||||
throw new Error(
|
||||
"Could not parse the template's devDependencies.json: " + err.message,
|
||||
);
|
||||
}
|
||||
for (let depName in dependencies) {
|
||||
const depVersion = dependencies[depName];
|
||||
const depToInstall = depName + '@' + depVersion;
|
||||
console.log('Adding ' + depToInstall + '...');
|
||||
if (yarnVersion) {
|
||||
execSync(`yarn add ${depToInstall} -D`, {stdio: 'inherit'});
|
||||
} else {
|
||||
execSync(`npm install ${depToInstall} --save-dev --save-exact`, {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
createProjectFromTemplate,
|
||||
};
|
||||
@@ -1,85 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 envinfo = require('envinfo');
|
||||
|
||||
const info = function() {
|
||||
const args = Array.prototype.slice.call(arguments)[2];
|
||||
|
||||
try {
|
||||
envinfo
|
||||
.run(
|
||||
{
|
||||
System: ['OS', 'CPU', 'Memory', 'Shell'],
|
||||
Binaries: ['Node', 'Yarn', 'npm', 'Watchman'],
|
||||
IDEs: ['Xcode', 'Android Studio'],
|
||||
SDKs: ['iOS SDK', 'Android SDK'],
|
||||
npmPackages:
|
||||
(typeof args.packages === 'string' &&
|
||||
!args.packages.includes('*')) ||
|
||||
!args.packages
|
||||
? ['react', 'react-native'].concat(
|
||||
(args.packages || '').split(','),
|
||||
)
|
||||
: args.packages,
|
||||
npmGlobalPackages: '*react-native*',
|
||||
},
|
||||
{
|
||||
clipboard: !!args.clipboard,
|
||||
title: 'React Native Environment Info',
|
||||
},
|
||||
)
|
||||
.then(console.log)
|
||||
.catch(err => {
|
||||
console.log('Error: unable to print environment info');
|
||||
console.log(err);
|
||||
});
|
||||
} catch (err) {
|
||||
console.log('Error: unable to print environment info');
|
||||
console.log(err);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
name: 'info',
|
||||
description: 'Get relevant version info about OS, toolchain and libraries',
|
||||
options: [
|
||||
{
|
||||
command: '--packages [string]',
|
||||
description:
|
||||
'Which packages from your package.json to include, in addition to the default React Native and React versions.',
|
||||
},
|
||||
{
|
||||
command: '--clipboard [boolean]',
|
||||
description:
|
||||
'Automagically copy the environment report output to the clipboard',
|
||||
},
|
||||
],
|
||||
examples: [
|
||||
{
|
||||
desc: 'Get standard version info',
|
||||
cmd: 'react-native info',
|
||||
},
|
||||
{
|
||||
desc: 'Get standard version info & specified package versions',
|
||||
cmd: 'react-native info --packages jest,eslint',
|
||||
},
|
||||
{
|
||||
desc: 'Get standard version info & globbed package versions',
|
||||
cmd: 'react-native info --packages "*react*"',
|
||||
},
|
||||
{
|
||||
desc: 'Get standard version info & all package versions',
|
||||
cmd: 'react-native info --packages',
|
||||
},
|
||||
],
|
||||
func: info,
|
||||
};
|
||||
@@ -1,122 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 {createProjectFromTemplate} = require('../generator/templates');
|
||||
const execSync = require('child_process').execSync;
|
||||
const fs = require('fs');
|
||||
const minimist = require('minimist');
|
||||
const path = require('path');
|
||||
const printRunInstructions = require('../generator/printRunInstructions');
|
||||
const process = require('process');
|
||||
const yarn = require('../util/yarn');
|
||||
|
||||
/**
|
||||
* Creates the template for a React Native project given the provided
|
||||
* parameters:
|
||||
* @param projectDir Templates will be copied here.
|
||||
* @param argsOrName Project name or full list of custom arguments
|
||||
* for the generator.
|
||||
* @param options Command line options passed from the react-native-cli directly.
|
||||
* E.g. `{ version: '0.43.0', template: 'navigation' }`
|
||||
*/
|
||||
function init(projectDir, argsOrName) {
|
||||
const args = Array.isArray(argsOrName)
|
||||
? argsOrName // argsOrName was e.g. ['AwesomeApp', '--verbose']
|
||||
: [argsOrName].concat(process.argv.slice(4)); // argsOrName was e.g. 'AwesomeApp'
|
||||
|
||||
// args array is e.g. ['AwesomeApp', '--verbose', '--template', 'navigation']
|
||||
if (!args || args.length === 0) {
|
||||
console.error('react-native init requires a project name.');
|
||||
return;
|
||||
}
|
||||
|
||||
const newProjectName = args[0];
|
||||
const options = minimist(args);
|
||||
|
||||
console.log('Setting up new React Native app in ' + projectDir);
|
||||
generateProject(projectDir, newProjectName, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a new React Native project based on the template.
|
||||
* @param Absolute path at which the project folder should be created.
|
||||
* @param options Command line arguments parsed by minimist.
|
||||
*/
|
||||
function generateProject(destinationRoot, newProjectName, options) {
|
||||
var reactNativePackageJson = require('../../package.json');
|
||||
var {peerDependencies} = reactNativePackageJson;
|
||||
if (!peerDependencies) {
|
||||
console.error(
|
||||
"Missing React peer dependency in React Native's package.json. Aborting.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
var reactVersion = peerDependencies.react;
|
||||
if (!reactVersion) {
|
||||
console.error(
|
||||
"Missing React peer dependency in React Native's package.json. Aborting.",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const yarnVersion =
|
||||
!options.npm &&
|
||||
yarn.getYarnVersionIfAvailable() &&
|
||||
yarn.isGlobalCliUsingYarn(destinationRoot);
|
||||
|
||||
createProjectFromTemplate(
|
||||
destinationRoot,
|
||||
newProjectName,
|
||||
options.template,
|
||||
yarnVersion,
|
||||
);
|
||||
|
||||
if (yarnVersion) {
|
||||
console.log('Adding React...');
|
||||
execSync(`yarn add react@${reactVersion}`, {stdio: 'inherit'});
|
||||
} else {
|
||||
console.log('Installing React...');
|
||||
execSync(`npm install react@${reactVersion} --save --save-exact`, {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
if (!options['skip-jest']) {
|
||||
const jestDeps = `jest babel-jest metro-react-native-babel-preset react-test-renderer@${reactVersion}`;
|
||||
if (yarnVersion) {
|
||||
console.log('Adding Jest...');
|
||||
execSync(`yarn add ${jestDeps} --dev --exact`, {stdio: 'inherit'});
|
||||
} else {
|
||||
console.log('Installing Jest...');
|
||||
execSync(`npm install ${jestDeps} --save-dev --save-exact`, {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
}
|
||||
addJestToPackageJson(destinationRoot);
|
||||
}
|
||||
printRunInstructions(destinationRoot, newProjectName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Jest-related stuff to package.json, which was created by the react-native-cli.
|
||||
*/
|
||||
function addJestToPackageJson(destinationRoot) {
|
||||
var packageJSONPath = path.join(destinationRoot, 'package.json');
|
||||
var packageJSON = JSON.parse(fs.readFileSync(packageJSONPath));
|
||||
|
||||
packageJSON.scripts.test = 'jest';
|
||||
packageJSON.jest = {
|
||||
preset: 'react-native',
|
||||
};
|
||||
fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON, null, 2));
|
||||
}
|
||||
|
||||
module.exports = init;
|
||||
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 spawnSync = require('child_process').spawnSync;
|
||||
const log = require('npmlog');
|
||||
const PackageManager = require('../util/PackageManager');
|
||||
const spawnOpts = {
|
||||
stdio: 'inherit',
|
||||
stdin: 'inherit',
|
||||
};
|
||||
|
||||
log.heading = 'rnpm-install';
|
||||
|
||||
function install(args, config) {
|
||||
const name = args[0];
|
||||
|
||||
let res = PackageManager.add(name);
|
||||
|
||||
if (res.status) {
|
||||
process.exit(res.status);
|
||||
}
|
||||
|
||||
res = spawnSync('react-native', ['link', name], spawnOpts);
|
||||
|
||||
if (res.status) {
|
||||
process.exit(res.status);
|
||||
}
|
||||
|
||||
log.info(`Module ${name} has been successfully installed & linked`);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
func: install,
|
||||
description: 'install and link native dependencies',
|
||||
name: 'install <packageName>',
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 spawnSync = require('child_process').spawnSync;
|
||||
const log = require('npmlog');
|
||||
const PackageManager = require('../util/PackageManager');
|
||||
const spawnOpts = {
|
||||
stdio: 'inherit',
|
||||
stdin: 'inherit',
|
||||
};
|
||||
|
||||
log.heading = 'rnpm-install';
|
||||
|
||||
function uninstall(args, config) {
|
||||
const name = args[0];
|
||||
|
||||
var res = spawnSync('react-native', ['unlink', name], spawnOpts);
|
||||
|
||||
if (res.status) {
|
||||
process.exit(res.status);
|
||||
}
|
||||
|
||||
res = PackageManager.remove(name);
|
||||
|
||||
if (res.status) {
|
||||
process.exit(res.status);
|
||||
}
|
||||
|
||||
log.info(`Module ${name} has been successfully uninstalled & unlinked`);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
func: uninstall,
|
||||
description: 'uninstall and unlink native dependencies',
|
||||
name: 'uninstall <packageName>',
|
||||
};
|
||||
@@ -1,87 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* 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 copyAndReplace = require('../util/copyAndReplace');
|
||||
const fs = require('fs');
|
||||
const isValidPackageName = require('../util/isValidPackageName');
|
||||
const path = require('path');
|
||||
const walk = require('../util/walk');
|
||||
|
||||
/**
|
||||
* Creates a new native library with the given name
|
||||
*/
|
||||
function library(argv, config, args) {
|
||||
if (!isValidPackageName(args.name)) {
|
||||
return Promise.reject(
|
||||
args.name +
|
||||
' is not a valid name for a project. Please use a valid ' +
|
||||
'identifier name (alphanumeric).',
|
||||
);
|
||||
}
|
||||
|
||||
const root = process.cwd();
|
||||
const libraries = path.resolve(root, 'Libraries');
|
||||
const libraryDest = path.resolve(libraries, args.name);
|
||||
const source = path.resolve(
|
||||
'node_modules',
|
||||
'react-native',
|
||||
'Libraries',
|
||||
'Sample',
|
||||
);
|
||||
|
||||
if (!fs.existsSync(libraries)) {
|
||||
fs.mkdirSync(libraries);
|
||||
}
|
||||
|
||||
if (fs.existsSync(libraryDest)) {
|
||||
return Promise.reject(
|
||||
new Error(`Library already exists in ${libraryDest}`),
|
||||
);
|
||||
}
|
||||
|
||||
walk(source).forEach(f => {
|
||||
if (
|
||||
f.indexOf('project.xcworkspace') !== -1 ||
|
||||
f.indexOf('.xcodeproj/xcuserdata') !== -1
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dest = path.relative(
|
||||
source,
|
||||
f.replace(/Sample/g, args.name).replace(/^_/, '.'),
|
||||
);
|
||||
copyAndReplace(path.resolve(source, f), path.resolve(libraryDest, dest), {
|
||||
Sample: args.name,
|
||||
});
|
||||
});
|
||||
|
||||
console.log('Created library in', libraryDest);
|
||||
console.log('Next Steps:');
|
||||
console.log(' Link your library in Xcode:');
|
||||
console.log(
|
||||
' https://facebook.github.io/react-native/docs/' +
|
||||
'linking-libraries-ios.html#content\n',
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
name: 'new-library',
|
||||
func: library,
|
||||
description: 'generates a native library bridge',
|
||||
options: [
|
||||
{
|
||||
command: '--name <string>',
|
||||
description: 'name of the library to generate',
|
||||
default: null,
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,85 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.basic;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import com.facebook.react.LifecycleState;
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.ReactRootView;
|
||||
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
|
||||
import com.facebook.react.shell.MainReactPackage;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
|
||||
public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
|
||||
|
||||
private ReactInstanceManager mReactInstanceManager;
|
||||
private ReactRootView mReactRootView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mReactRootView = new ReactRootView(this);
|
||||
|
||||
mReactInstanceManager = ReactInstanceManager.builder()
|
||||
.setApplication(getApplication())
|
||||
.setBundleAssetName("index.android.bundle")
|
||||
.setJSMainModuleName("index.android")
|
||||
.addPackage(new MainReactPackage())
|
||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||
.setInitialLifecycleState(LifecycleState.RESUMED)
|
||||
.build();
|
||||
|
||||
mReactRootView.startReactApplication(mReactInstanceManager, "Basic", null);
|
||||
|
||||
setContentView(mReactRootView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
|
||||
mReactInstanceManager.showDevOptionsDialog();
|
||||
return true;
|
||||
}
|
||||
return super.onKeyUp(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (mReactInstanceManager != null) {
|
||||
mReactInstanceManager.onBackPressed();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invokeDefaultOnBackPressed() {
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
if (mReactInstanceManager != null) {
|
||||
mReactInstanceManager.onPause();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
if (mReactInstanceManager != null) {
|
||||
mReactInstanceManager.onResume(this, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.basic;
|
||||
|
||||
import android.app.Activity;
|
||||
import com.oblador.vectoricons.VectorIconsPackage;
|
||||
import android.os.Bundle;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import com.facebook.react.LifecycleState;
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.ReactRootView;
|
||||
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
|
||||
import com.facebook.react.shell.MainReactPackage;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
|
||||
public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
|
||||
|
||||
private ReactInstanceManager mReactInstanceManager;
|
||||
private ReactRootView mReactRootView;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mReactRootView = new ReactRootView(this);
|
||||
|
||||
mReactInstanceManager = ReactInstanceManager.builder()
|
||||
.setApplication(getApplication())
|
||||
.setBundleAssetName("index.android.bundle")
|
||||
.setJSMainModuleName("index.android")
|
||||
.addPackage(new MainReactPackage())
|
||||
.addPackage(new VectorIconsPackage())
|
||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||
.setInitialLifecycleState(LifecycleState.RESUMED)
|
||||
.build();
|
||||
|
||||
mReactRootView.startReactApplication(mReactInstanceManager, "Basic", null);
|
||||
|
||||
setContentView(mReactRootView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
|
||||
mReactInstanceManager.showDevOptionsDialog();
|
||||
return true;
|
||||
}
|
||||
return super.onKeyUp(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (mReactInstanceManager != null) {
|
||||
mReactInstanceManager.onBackPressed();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invokeDefaultOnBackPressed() {
|
||||
super.onBackPressed();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
|
||||
if (mReactInstanceManager != null) {
|
||||
mReactInstanceManager.onPause();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
if (mReactInstanceManager != null) {
|
||||
mReactInstanceManager.onResume(this, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.testrn;
|
||||
|
||||
import com.facebook.react.ReactActivity;
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.react.shell.MainReactPackage;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class MainActivity extends ReactActivity {
|
||||
|
||||
/**
|
||||
* Returns the name of the main component registered from JavaScript.
|
||||
* This is used to schedule rendering of the component.
|
||||
*/
|
||||
@Override
|
||||
protected String getMainComponentName() {
|
||||
return "TestRN";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether dev mode should be enabled.
|
||||
* This enables e.g. the dev menu.
|
||||
*/
|
||||
@Override
|
||||
protected boolean getUseDeveloperSupport() {
|
||||
return BuildConfig.DEBUG;
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of packages used by the app. If the app uses additional views
|
||||
* or modules besides the default ones, add more packages here.
|
||||
*/
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
return Arrays.<ReactPackage>asList(
|
||||
new MainReactPackage());
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.testrn;
|
||||
|
||||
import com.facebook.react.ReactActivity;
|
||||
import com.oblador.vectoricons.VectorIconsPackage;
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.react.shell.MainReactPackage;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class MainActivity extends ReactActivity {
|
||||
|
||||
/**
|
||||
* Returns the name of the main component registered from JavaScript.
|
||||
* This is used to schedule rendering of the component.
|
||||
*/
|
||||
@Override
|
||||
protected String getMainComponentName() {
|
||||
return "TestRN";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether dev mode should be enabled.
|
||||
* This enables e.g. the dev menu.
|
||||
*/
|
||||
@Override
|
||||
protected boolean getUseDeveloperSupport() {
|
||||
return BuildConfig.DEBUG;
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of packages used by the app. If the app uses additional views
|
||||
* or modules besides the default ones, add more packages here.
|
||||
*/
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
return Arrays.<ReactPackage>asList(
|
||||
new MainReactPackage(),
|
||||
new VectorIconsPackage());
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
package com.myawesomeproject;
|
||||
|
||||
import com.facebook.react.ReactActivity;
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.react.shell.MainReactPackage;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class MainActivity extends ReactActivity {
|
||||
|
||||
/**
|
||||
* Returns the name of the main component registered from JavaScript.
|
||||
* This is used to schedule rendering of the component.
|
||||
*/
|
||||
@Override
|
||||
protected String getMainComponentName() {
|
||||
return "TestRN";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether dev mode should be enabled.
|
||||
* This enables e.g. the dev menu.
|
||||
*/
|
||||
@Override
|
||||
protected boolean getUseDeveloperSupport() {
|
||||
return BuildConfig.DEBUG;
|
||||
}
|
||||
|
||||
/**
|
||||
* A list of packages used by the app. If the app uses additional views
|
||||
* or modules besides the default ones, add more packages here.
|
||||
*/
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
return Arrays.<ReactPackage>asList(
|
||||
new MainReactPackage()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||
implementation "com.android.support:appcompat-v7:27.1.1"
|
||||
implementation "com.facebook.react:react-native:+"
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
dependencies {
|
||||
implementation project(':test')
|
||||
implementation(project(':test2')) {
|
||||
exclude(group: 'org.unwanted', module: 'test10')
|
||||
}
|
||||
implementation fileTree(dir: "libs", include: ["*.jar"])
|
||||
implementation "com.android.support:appcompat-v7:27.1.1"
|
||||
implementation "com.facebook.react:react-native:+"
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
rootProject.name = 'TestRN'
|
||||
|
||||
include ':app'
|
||||
include ':test'
|
||||
project(':test').projectDir = new File(rootProject.projectDir, '../node_modules/test/android')
|
||||
@@ -1,10 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
rootProject.name = 'TestRN'
|
||||
|
||||
include ':app'
|
||||
@@ -1,258 +0,0 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
BBD49E3F1AC8DEF000610F8E /* BVLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */; };
|
||||
BBD49E401AC8DEF000610F8E /* BVLinearGradientManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
58B511D91A9E6C8500147676 /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "include/$(PRODUCT_NAME)";
|
||||
dstSubfolderSpec = 16;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
134814201AA4EA6300B7C361 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBVLinearGradient.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
BBD49E391AC8DEF000610F8E /* BVLinearGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradient.h; sourceTree = "<group>"; };
|
||||
BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradient.m; sourceTree = "<group>"; };
|
||||
BBD49E3B1AC8DEF000610F8E /* BVLinearGradientManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradientManager.h; sourceTree = "<group>"; };
|
||||
BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradientManager.m; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
58B511D81A9E6C8500147676 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
134814211AA4EA7D00B7C361 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
134814201AA4EA6300B7C361 /* libBVLinearGradient.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
58B511D21A9E6C8500147676 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
BBD49E391AC8DEF000610F8E /* BVLinearGradient.h */,
|
||||
BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */,
|
||||
BBD49E3B1AC8DEF000610F8E /* BVLinearGradientManager.h */,
|
||||
BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */,
|
||||
134814211AA4EA7D00B7C361 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
58B511DA1A9E6C8500147676 /* BVLinearGradient */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "BVLinearGradient" */;
|
||||
buildPhases = (
|
||||
58B511D71A9E6C8500147676 /* Sources */,
|
||||
58B511D81A9E6C8500147676 /* Frameworks */,
|
||||
58B511D91A9E6C8500147676 /* CopyFiles */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = BVLinearGradient;
|
||||
productName = RCTDataManager;
|
||||
productReference = 134814201AA4EA6300B7C361 /* libBVLinearGradient.a */;
|
||||
productType = "com.apple.product-type.library.static";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
58B511D31A9E6C8500147676 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0610;
|
||||
ORGANIZATIONNAME = Facebook;
|
||||
TargetAttributes = {
|
||||
58B511DA1A9E6C8500147676 = {
|
||||
CreatedOnToolsVersion = 6.1.1;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "BVLinearGradient" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
);
|
||||
mainGroup = 58B511D21A9E6C8500147676;
|
||||
productRefGroup = 58B511D21A9E6C8500147676;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
58B511DA1A9E6C8500147676 /* BVLinearGradient */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
58B511D71A9E6C8500147676 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
BBD49E3F1AC8DEF000610F8E /* BVLinearGradient.m in Sources */,
|
||||
BBD49E401AC8DEF000610F8E /* BVLinearGradientManager.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
58B511ED1A9E6C8500147676 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
58B511EE1A9E6C8500147676 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
58B511F01A9E6C8500147676 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
"$(SRCROOT)/../../React/**",
|
||||
"$(SRCROOT)/../react-native/React/**",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = BVLinearGradient;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
58B511F11A9E6C8500147676 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
HEADER_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
"$(SRCROOT)/../../React/**",
|
||||
"$(SRCROOT)/../react-native/React/**",
|
||||
);
|
||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = BVLinearGradient;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "BVLinearGradient" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
58B511ED1A9E6C8500147676 /* Debug */,
|
||||
58B511EE1A9E6C8500147676 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "BVLinearGradient" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
58B511F01A9E6C8500147676 /* Debug */,
|
||||
58B511F11A9E6C8500147676 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 58B511D31A9E6C8500147676 /* Project object */;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
platform :ios, '9.0'
|
||||
|
||||
target 'Testing' do
|
||||
pod 'TestPod', '~> 3.1'
|
||||
|
||||
# test should point to this line
|
||||
end
|
||||
@@ -1,30 +0,0 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
platform :ios, '9.0'
|
||||
|
||||
target 'none' do
|
||||
pod 'React',
|
||||
:path => "../node_modules/react-native",
|
||||
:subspecs => [
|
||||
"Core",
|
||||
"ART",
|
||||
"RCTActionSheet",
|
||||
"RCTAnimation",
|
||||
"RCTCameraRoll",
|
||||
"RCTGeolocation",
|
||||
"RCTImage",
|
||||
"RCTNetwork",
|
||||
"RCTText",
|
||||
"RCTVibration",
|
||||
"RCTWebSocket",
|
||||
"DevSupport",
|
||||
"BatchedBridge"
|
||||
]
|
||||
|
||||
pod 'Yoga',
|
||||
:path => "../node_modules/react-native/ReactCommon/yoga"
|
||||
|
||||
# test should point to this line
|
||||
post_install do |installer|
|
||||
|
||||
end
|
||||
end
|
||||
@@ -1,34 +0,0 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
# platform :ios, '9.0'
|
||||
|
||||
target 'None' do
|
||||
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
|
||||
# use_frameworks!
|
||||
# Your 'node_modules' directory is probably in the root of your project, # but if not, adjust the `:path` accordingly
|
||||
pod 'React', :path => '../node_modules/react-native', :subspecs => [
|
||||
'Core',
|
||||
'RCTText',
|
||||
'RCTNetwork',
|
||||
'BatchedBridge',
|
||||
'RCTImage',
|
||||
'RCTWebSocket', # needed for debugging
|
||||
# Add any other subspecs you want to use in your project
|
||||
]
|
||||
|
||||
# Add new pods below this line
|
||||
|
||||
# test should point to this line
|
||||
target 'NoneTests' do
|
||||
inherit! :search_paths
|
||||
# Pods for testing
|
||||
end
|
||||
end
|
||||
|
||||
target 'Second' do
|
||||
|
||||
target 'NoneUITests' do
|
||||
inherit! :search_paths
|
||||
# Add new pods below this line
|
||||
end
|
||||
|
||||
end
|
||||
@@ -1,32 +0,0 @@
|
||||
source 'https://github.com/CocoaPods/Specs.git'
|
||||
# platform :ios, '9.0'
|
||||
|
||||
target 'None' do
|
||||
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
|
||||
# use_frameworks!
|
||||
# Your 'node_modules' directory is probably in the root of your project, # but if not, adjust the `:path` accordingly
|
||||
pod 'React', :path => '../node_modules/react-native', :subspecs => [
|
||||
'Core',
|
||||
'RCTText',
|
||||
'RCTNetwork',
|
||||
'BatchedBridge',
|
||||
'RCTImage',
|
||||
'RCTWebSocket', # needed for debugging
|
||||
# Add any other subspecs you want to use in your project
|
||||
]
|
||||
|
||||
# Explicitly include Yoga if you are using RN >= 0.42.0
|
||||
pod "Yoga", :path => "../node_modules/react-native/ReactCommon/yoga"
|
||||
|
||||
# test should point to this line
|
||||
target 'NoneTests' do
|
||||
inherit! :search_paths
|
||||
# Pods for testing
|
||||
end
|
||||
|
||||
target 'NoneUITests' do
|
||||
inherit! :search_paths
|
||||
# Pods for testing
|
||||
end
|
||||
|
||||
end
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,25 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const applyParams = require('../../android/patches/applyParams');
|
||||
|
||||
describe('applyParams', () => {
|
||||
it('apply params to the string', () => {
|
||||
expect(applyParams('${foo}', {foo: 'foo'}, 'react-native')).toEqual(
|
||||
'getResources().getString(R.string.reactNative_foo)',
|
||||
);
|
||||
});
|
||||
|
||||
it('use null if no params provided', () => {
|
||||
expect(applyParams('${foo}', {}, 'react-native')).toEqual('null');
|
||||
});
|
||||
});
|
||||
@@ -1,31 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const isInstalled = require('../../android/isInstalled');
|
||||
|
||||
const projectConfig = {
|
||||
buildGradlePath: path.join(
|
||||
__dirname,
|
||||
'../../__fixtures__/android/patchedBuild.gradle',
|
||||
),
|
||||
};
|
||||
|
||||
describe('android::isInstalled', () => {
|
||||
it('should return true when project is already in build.gradle', () => {
|
||||
expect(isInstalled(projectConfig, 'test')).toBeTruthy();
|
||||
expect(isInstalled(projectConfig, 'test2')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should return false when project is not in build.gradle', () =>
|
||||
expect(isInstalled(projectConfig, 'test3')).toBeFalsy());
|
||||
});
|
||||
@@ -1,52 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const makeBuildPatch = require('../../android/patches/makeBuildPatch');
|
||||
const normalizeProjectName = require('../../android/patches/normalizeProjectName');
|
||||
|
||||
const name = 'test';
|
||||
const scopedName = '@scoped/test';
|
||||
const normalizedScopedName = normalizeProjectName('@scoped/test');
|
||||
|
||||
describe('makeBuildPatch', () => {
|
||||
it('should build a patch function', () => {
|
||||
expect(Object.prototype.toString(makeBuildPatch(name))).toBe(
|
||||
'[object Object]',
|
||||
);
|
||||
});
|
||||
|
||||
it('should make a correct patch', () => {
|
||||
const {patch} = makeBuildPatch(name);
|
||||
expect(patch).toBe(` implementation project(':${name}')\n`);
|
||||
});
|
||||
|
||||
it('should make a correct install check pattern', () => {
|
||||
const {installPattern} = makeBuildPatch(name);
|
||||
const match = `/\\s{4}(implementation)(\\(|\\s)(project)\\(\\':${name}\\'\\)(\\)|\\s)/`;
|
||||
expect(installPattern.toString()).toBe(match);
|
||||
});
|
||||
});
|
||||
|
||||
describe('makeBuildPatchWithScopedPackage', () => {
|
||||
it('should make a correct patch', () => {
|
||||
const {patch} = makeBuildPatch(scopedName);
|
||||
expect(patch).toBe(
|
||||
` implementation project(':${normalizedScopedName}')\n`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should make a correct install check pattern', () => {
|
||||
const {installPattern} = makeBuildPatch(scopedName);
|
||||
const match = `/\\s{4}(implementation)(\\(|\\s)(project)\\(\\':${normalizedScopedName}\\'\\)(\\)|\\s)/`;
|
||||
expect(installPattern.toString()).toBe(match);
|
||||
});
|
||||
});
|
||||
@@ -1,29 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const makeImportPatch = require('../../android/patches/makeImportPatch');
|
||||
|
||||
const packageImportPath = 'import some.example.project';
|
||||
|
||||
describe('makeImportPatch', () => {
|
||||
it('should build a patch', () => {
|
||||
expect(Object.prototype.toString(makeImportPatch(packageImportPath))).toBe(
|
||||
'[object Object]',
|
||||
);
|
||||
});
|
||||
|
||||
it('MainActivity contains a correct import patch', () => {
|
||||
const {patch} = makeImportPatch(packageImportPath);
|
||||
|
||||
expect(patch).toBe('\n' + packageImportPath);
|
||||
});
|
||||
});
|
||||
@@ -1,35 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const makePackagePatch = require('../../android/patches/makePackagePatch');
|
||||
const applyParams = require('../../android/patches/applyParams');
|
||||
|
||||
const packageInstance = "new SomeLibrary(${foo}, ${bar}, 'something')";
|
||||
const name = 'some-library';
|
||||
const params = {
|
||||
foo: 'foo',
|
||||
bar: 'bar',
|
||||
};
|
||||
|
||||
describe('makePackagePatch@0.20', () => {
|
||||
it('should build a patch', () => {
|
||||
const packagePatch = makePackagePatch(packageInstance, params, name);
|
||||
expect(Object.prototype.toString(packagePatch)).toBe('[object Object]');
|
||||
});
|
||||
|
||||
it('MainActivity contains a correct 0.20 import patch', () => {
|
||||
const {patch} = makePackagePatch(packageInstance, params, name);
|
||||
const processedInstance = applyParams(packageInstance, params, name);
|
||||
|
||||
expect(patch).toBe(',\n ' + processedInstance);
|
||||
});
|
||||
});
|
||||
@@ -1,83 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const makeSettingsPatch = require('../../android/patches/makeSettingsPatch');
|
||||
const normalizeProjectName = require('../../android/patches/normalizeProjectName');
|
||||
|
||||
const name = 'test';
|
||||
const scopedName = '@scoped/test';
|
||||
const normalizedScopedName = normalizeProjectName('@scoped/test');
|
||||
const projectConfig = {
|
||||
sourceDir: '/home/project/android/app',
|
||||
settingsGradlePath: '/home/project/android/settings.gradle',
|
||||
};
|
||||
const dependencyConfig = {
|
||||
sourceDir: `/home/project/node_modules/${name}/android`,
|
||||
};
|
||||
const scopedDependencyConfig = {
|
||||
sourceDir: `/home/project/node_modules/${scopedName}/android`,
|
||||
};
|
||||
|
||||
describe('makeSettingsPatch', () => {
|
||||
it('should build a patch function', () => {
|
||||
expect(
|
||||
Object.prototype.toString(
|
||||
makeSettingsPatch(name, dependencyConfig, projectConfig),
|
||||
),
|
||||
).toBe('[object Object]');
|
||||
});
|
||||
|
||||
it('should make a correct patch', () => {
|
||||
const projectDir = path.relative(
|
||||
path.dirname(projectConfig.settingsGradlePath),
|
||||
dependencyConfig.sourceDir,
|
||||
);
|
||||
|
||||
const {patch} = makeSettingsPatch(name, dependencyConfig, projectConfig);
|
||||
|
||||
expect(patch).toBe(
|
||||
`include ':${name}'\n` +
|
||||
`project(':${name}').projectDir = ` +
|
||||
`new File(rootProject.projectDir, '${projectDir}')\n`,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('makeSettingsPatchWithScopedPackage', () => {
|
||||
it('should build a patch function', () => {
|
||||
expect(
|
||||
Object.prototype.toString(
|
||||
makeSettingsPatch(scopedName, scopedDependencyConfig, projectConfig),
|
||||
),
|
||||
).toBe('[object Object]');
|
||||
});
|
||||
|
||||
it('should make a correct patch', () => {
|
||||
const projectDir = path.relative(
|
||||
path.dirname(projectConfig.settingsGradlePath),
|
||||
scopedDependencyConfig.sourceDir,
|
||||
);
|
||||
|
||||
const {patch} = makeSettingsPatch(
|
||||
scopedName,
|
||||
scopedDependencyConfig,
|
||||
projectConfig,
|
||||
);
|
||||
|
||||
expect(patch).toBe(
|
||||
`include ':${normalizedScopedName}'\n` +
|
||||
`project(':${normalizedScopedName}').projectDir = ` +
|
||||
`new File(rootProject.projectDir, '${projectDir}')\n`,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1,29 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const makeStringsPatch = require('../../android/patches/makeStringsPatch');
|
||||
|
||||
describe('makeStringsPatch', () => {
|
||||
it('should export a patch with <string> element', () => {
|
||||
const params = {
|
||||
keyA: 'valueA',
|
||||
};
|
||||
|
||||
expect(makeStringsPatch(params, 'module').patch).toContain(
|
||||
'<string moduleConfig="true" name="module_keyA">valueA</string>',
|
||||
);
|
||||
});
|
||||
|
||||
it('should export an empty patch if no params given', () => {
|
||||
expect(makeStringsPatch({}, 'module').patch).toBe('');
|
||||
});
|
||||
});
|
||||
@@ -1,23 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const normalizeProjectName = require('../../android/patches/normalizeProjectName');
|
||||
|
||||
const name = 'test';
|
||||
const scopedName = '@scoped/test';
|
||||
|
||||
describe('normalizeProjectName', () => {
|
||||
it('should replace slashes with underscores', () => {
|
||||
expect(normalizeProjectName(name)).toBe('test');
|
||||
expect(normalizeProjectName(scopedName)).toBe('@scoped_test');
|
||||
});
|
||||
});
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const getDependencyConfig = require('../getDependencyConfig');
|
||||
|
||||
describe('getDependencyConfig', () => {
|
||||
it("should return an array of dependencies' rnpm config", () => {
|
||||
const config = {
|
||||
getDependencyConfig: jest.fn(),
|
||||
};
|
||||
|
||||
expect(Array.isArray(getDependencyConfig(config, ['abcd']))).toBeTruthy();
|
||||
expect(config.getDependencyConfig.mock.calls.length).toEqual(1);
|
||||
});
|
||||
|
||||
it('should filter out invalid react-native projects', () => {
|
||||
const config = {
|
||||
getDependencyConfig: jest.fn().mockImplementation(() => {
|
||||
throw new Error('Cannot require');
|
||||
}),
|
||||
};
|
||||
|
||||
expect(getDependencyConfig(config, ['abcd'])).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -1,35 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const getProjectDependencies = require('../getProjectDependencies');
|
||||
const path = require('path');
|
||||
|
||||
const CWD = path.resolve(__dirname, '../../..');
|
||||
|
||||
describe('getProjectDependencies', () => {
|
||||
beforeEach(() => {
|
||||
jest.resetModules();
|
||||
});
|
||||
it('should return an array of project dependencies', () => {
|
||||
jest.setMock(path.join(CWD, './package.json'), {
|
||||
dependencies: {lodash: '^6.0.0', 'react-native': '^16.0.0'},
|
||||
});
|
||||
|
||||
expect(getProjectDependencies(CWD)).toEqual(['lodash']);
|
||||
});
|
||||
|
||||
it('should return an empty array when no dependencies set', () => {
|
||||
jest.setMock(path.join(CWD, './package.json'), {});
|
||||
expect(getProjectDependencies(CWD)).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -1,25 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const groupFilesByType = require('../groupFilesByType');
|
||||
|
||||
describe('groupFilesByType', () => {
|
||||
it('should group files by its type', () => {
|
||||
const fonts = ['fonts/a.ttf', 'fonts/b.ttf'];
|
||||
const images = ['images/a.jpg', 'images/c.jpeg'];
|
||||
|
||||
const groupedFiles = groupFilesByType(fonts.concat(images));
|
||||
|
||||
expect(groupedFiles.font).toEqual(fonts);
|
||||
expect(groupedFiles.image).toEqual(images);
|
||||
});
|
||||
});
|
||||
@@ -1,36 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const xcode = require('xcode');
|
||||
const path = require('path');
|
||||
const addFileToProject = require('../../ios/addFileToProject');
|
||||
const _ = require('lodash');
|
||||
|
||||
const project = xcode.project(
|
||||
path.join(__dirname, '../../__fixtures__/project.pbxproj'),
|
||||
);
|
||||
|
||||
describe('ios::addFileToProject', () => {
|
||||
beforeEach(() => {
|
||||
project.parseSync();
|
||||
});
|
||||
|
||||
xit('should add file to a project', () => {
|
||||
expect(
|
||||
_.includes(
|
||||
Object.keys(project.pbxFileReferenceSection()),
|
||||
addFileToProject(project, '../../__fixtures__/linearGradient.pbxproj')
|
||||
.fileRef,
|
||||
),
|
||||
).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -1,38 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const xcode = require('xcode');
|
||||
const path = require('path');
|
||||
const PbxFile = require('xcode/lib/pbxFile');
|
||||
const addProjectToLibraries = require('../../ios/addProjectToLibraries');
|
||||
const last = require('lodash').last;
|
||||
|
||||
const project = xcode.project(
|
||||
path.join(__dirname, '../../__fixtures__/project.pbxproj'),
|
||||
);
|
||||
|
||||
describe('ios::addProjectToLibraries', () => {
|
||||
beforeEach(() => {
|
||||
project.parseSync();
|
||||
});
|
||||
|
||||
it('should append file to Libraries group', () => {
|
||||
const file = new PbxFile('fakePath');
|
||||
const libraries = project.pbxGroupByName('Libraries');
|
||||
|
||||
addProjectToLibraries(libraries, file);
|
||||
|
||||
const child = last(libraries.children);
|
||||
|
||||
expect(child.comment).toBe(file.basename);
|
||||
});
|
||||
});
|
||||
@@ -1,51 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const xcode = require('xcode');
|
||||
const path = require('path');
|
||||
const addSharedLibraries = require('../../ios/addSharedLibraries');
|
||||
const getGroup = require('../../ios/getGroup');
|
||||
|
||||
const project = xcode.project(
|
||||
path.join(__dirname, '../../__fixtures__/project.pbxproj'),
|
||||
);
|
||||
|
||||
describe('ios::addSharedLibraries', () => {
|
||||
beforeEach(() => {
|
||||
project.parseSync();
|
||||
});
|
||||
|
||||
it('should automatically create Frameworks group', () => {
|
||||
expect(getGroup(project, 'Frameworks')).toBeNull();
|
||||
addSharedLibraries(project, ['libz.tbd']);
|
||||
expect(getGroup(project, 'Frameworks')).not.toBeNull();
|
||||
});
|
||||
|
||||
it('should add shared libraries to project', () => {
|
||||
addSharedLibraries(project, ['libz.tbd']);
|
||||
|
||||
const frameworksGroup = getGroup(project, 'Frameworks');
|
||||
expect(frameworksGroup.children.length).toEqual(1);
|
||||
expect(frameworksGroup.children[0].comment).toEqual('libz.tbd');
|
||||
|
||||
addSharedLibraries(project, ['MessageUI.framework']);
|
||||
expect(frameworksGroup.children.length).toEqual(2);
|
||||
});
|
||||
|
||||
it('should not add duplicate libraries to project', () => {
|
||||
addSharedLibraries(project, ['libz.tbd']);
|
||||
addSharedLibraries(project, ['libz.tbd']);
|
||||
|
||||
const frameworksGroup = getGroup(project, 'Frameworks');
|
||||
expect(frameworksGroup.children.length).toEqual(1);
|
||||
});
|
||||
});
|
||||
@@ -1,57 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const xcode = require('xcode');
|
||||
const path = require('path');
|
||||
const createGroup = require('../../ios/createGroup');
|
||||
const getGroup = require('../../ios/getGroup');
|
||||
const last = require('lodash').last;
|
||||
|
||||
const project = xcode.project(
|
||||
path.join(__dirname, '../../__fixtures__/project.pbxproj'),
|
||||
);
|
||||
|
||||
describe('ios::createGroup', () => {
|
||||
beforeEach(() => {
|
||||
project.parseSync();
|
||||
});
|
||||
|
||||
it('should create a group with given name', () => {
|
||||
const createdGroup = createGroup(project, 'Resources');
|
||||
expect(createdGroup.name).toBe('Resources');
|
||||
});
|
||||
|
||||
it('should attach group to main project group', () => {
|
||||
const createdGroup = createGroup(project, 'Resources');
|
||||
const mainGroup = getGroup(project);
|
||||
|
||||
expect(last(mainGroup.children).comment).toBe(createdGroup.name);
|
||||
});
|
||||
|
||||
it('should create a nested group with given path', () => {
|
||||
const createdGroup = createGroup(project, 'NewGroup/NewNestedGroup');
|
||||
const outerGroup = getGroup(project, 'NewGroup');
|
||||
|
||||
expect(last(outerGroup.children).comment).toBe(createdGroup.name);
|
||||
});
|
||||
|
||||
it('should-not create already created groups', () => {
|
||||
const createdGroup = createGroup(project, 'Libraries/NewNestedGroup');
|
||||
const outerGroup = getGroup(project, 'Libraries');
|
||||
const mainGroup = getGroup(project);
|
||||
|
||||
expect(
|
||||
mainGroup.children.filter(group => group.comment === 'Libraries').length,
|
||||
).toBe(1);
|
||||
expect(last(outerGroup.children).comment).toBe(createdGroup.name);
|
||||
});
|
||||
});
|
||||
@@ -1,30 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const xcode = require('xcode');
|
||||
const path = require('path');
|
||||
const getBuildProperty = require('../../ios/getBuildProperty');
|
||||
|
||||
const project = xcode.project(
|
||||
path.join(__dirname, '../../__fixtures__/project.pbxproj'),
|
||||
);
|
||||
|
||||
describe('ios::getBuildProperty', () => {
|
||||
beforeEach(() => {
|
||||
project.parseSync();
|
||||
});
|
||||
|
||||
it('should return build property from main target', () => {
|
||||
const plistPath = getBuildProperty(project, 'INFOPLIST_FILE');
|
||||
expect(plistPath).toEqual('Basic/Info.plist');
|
||||
});
|
||||
});
|
||||
@@ -1,49 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @format
|
||||
* @emails oncall+javascript_foundation
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const xcode = require('xcode');
|
||||
const getGroup = require('../../ios/getGroup');
|
||||
const path = require('path');
|
||||
|
||||
const project = xcode.project(
|
||||
path.join(__dirname, '../../__fixtures__/project.pbxproj'),
|
||||
);
|
||||
|
||||
describe('ios::getGroup', () => {
|
||||
beforeEach(() => {
|
||||
project.parseSync();
|
||||
});
|
||||
|
||||
it('should return a top-level group', () => {
|
||||
const group = getGroup(project, 'Libraries');
|
||||
expect(group.children.length > 0).toBeTruthy();
|
||||
expect(group.name).toBe('Libraries');
|
||||
});
|
||||
|
||||
it('should return nested group when specified', () => {
|
||||
const group = getGroup(project, 'NestedGroup/Libraries');
|
||||
expect(group.children.length).toBe(0); // our test nested Libraries is empty
|
||||
expect(group.name).toBe('Libraries');
|
||||
});
|
||||
|
||||
it('should return null when no group found', () => {
|
||||
const group = getGroup(project, 'I-Dont-Exist');
|
||||
expect(group).toBeNull();
|
||||
});
|
||||
|
||||
it('should return top-level group when name not specified', () => {
|
||||
const mainGroupId = project.getFirstProject().firstProject.mainGroup;
|
||||
const mainGroup = project.getPBXGroupByKey(mainGroupId);
|
||||
const group = getGroup(project);
|
||||
expect(group).toEqual(mainGroup);
|
||||
});
|
||||
});
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user