mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-29 04:35:36 +08:00
Merge pull request #405 from JoeStanton/new-library-cmd
[CLI] New Library Generator
This commit is contained in:
17
Libraries/Sample/Sample.android.js
Normal file
17
Libraries/Sample/Sample.android.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Stub of Sample for Android.
|
||||||
|
*
|
||||||
|
* @providesModule Sample
|
||||||
|
* @flow
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var warning = require('warning');
|
||||||
|
|
||||||
|
var Sample = {
|
||||||
|
test: function() {
|
||||||
|
warning("Not yet implemented for Android.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Sample;
|
||||||
5
Libraries/Sample/Sample.h
Normal file
5
Libraries/Sample/Sample.h
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#import "RCTBridgeModule.h"
|
||||||
|
|
||||||
|
@interface Sample : NSObject <RCTBridgeModule>
|
||||||
|
|
||||||
|
@end
|
||||||
20
Libraries/Sample/Sample.ios.js
Normal file
20
Libraries/Sample/Sample.ios.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* @providesModule Sample
|
||||||
|
* @flow
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var NativeSample = require('NativeModules').Sample;
|
||||||
|
var invariant = require('invariant');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* High-level docs for the Sample iOS API can be written here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Sample = {
|
||||||
|
test: function() {
|
||||||
|
NativeSample.test();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = Sample;
|
||||||
12
Libraries/Sample/Sample.m
Normal file
12
Libraries/Sample/Sample.m
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#import "Sample.h"
|
||||||
|
|
||||||
|
@implementation Sample
|
||||||
|
|
||||||
|
RCT_EXPORT_MODULE()
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(test)
|
||||||
|
{
|
||||||
|
// Your implementation here
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
251
Libraries/Sample/Sample.xcodeproj/project.pbxproj
Normal file
251
Libraries/Sample/Sample.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,251 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 46;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
13BE3DEE1AC21097009241FE /* Sample.m in Sources */ = {isa = PBXBuildFile; fileRef = 13BE3DED1AC21097009241FE /* Sample.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 /* libSample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSample.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
13BE3DEC1AC21097009241FE /* Sample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sample.h; sourceTree = "<group>"; };
|
||||||
|
13BE3DED1AC21097009241FE /* Sample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sample.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 /* libSample.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
58B511D21A9E6C8500147676 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13BE3DEC1AC21097009241FE /* Sample.h */,
|
||||||
|
13BE3DED1AC21097009241FE /* Sample.m */,
|
||||||
|
134814211AA4EA7D00B7C361 /* Products */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
58B511DA1A9E6C8500147676 /* Sample */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "Sample" */;
|
||||||
|
buildPhases = (
|
||||||
|
58B511D71A9E6C8500147676 /* Sources */,
|
||||||
|
58B511D81A9E6C8500147676 /* Frameworks */,
|
||||||
|
58B511D91A9E6C8500147676 /* CopyFiles */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = Sample;
|
||||||
|
productName = RCTDataManager;
|
||||||
|
productReference = 134814201AA4EA6300B7C361 /* libSample.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 "Sample" */;
|
||||||
|
compatibilityVersion = "Xcode 3.2";
|
||||||
|
developmentRegion = English;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
);
|
||||||
|
mainGroup = 58B511D21A9E6C8500147676;
|
||||||
|
productRefGroup = 58B511D21A9E6C8500147676;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
58B511DA1A9E6C8500147676 /* Sample */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
58B511D71A9E6C8500147676 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
13BE3DEE1AC21097009241FE /* Sample.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 = 7.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 = 7.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)/../../node_modules/react-native/React/**",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||||
|
OTHER_LDFLAGS = "-ObjC";
|
||||||
|
PRODUCT_NAME = Sample;
|
||||||
|
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/**",
|
||||||
|
);
|
||||||
|
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||||
|
OTHER_LDFLAGS = "-ObjC";
|
||||||
|
PRODUCT_NAME = Sample;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "Sample" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
58B511ED1A9E6C8500147676 /* Debug */,
|
||||||
|
58B511EE1A9E6C8500147676 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "Sample" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
58B511F01A9E6C8500147676 /* Debug */,
|
||||||
|
58B511F11A9E6C8500147676 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 58B511D31A9E6C8500147676 /* Project object */;
|
||||||
|
}
|
||||||
5
Libraries/Sample/package.json
Normal file
5
Libraries/Sample/package.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "Sample",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"keywords": "react-native"
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ var path = require('path');
|
|||||||
var init = require('./init.js');
|
var init = require('./init.js');
|
||||||
var install = require('./install.js');
|
var install = require('./install.js');
|
||||||
var bundle = require('./bundle.js');
|
var bundle = require('./bundle.js');
|
||||||
|
var newLibrary = require('./new-library.js');
|
||||||
|
|
||||||
function printUsage() {
|
function printUsage() {
|
||||||
console.log([
|
console.log([
|
||||||
@@ -18,7 +19,8 @@ function printUsage() {
|
|||||||
'Commands:',
|
'Commands:',
|
||||||
' start: starts the webserver',
|
' start: starts the webserver',
|
||||||
' install: installs npm react components',
|
' install: installs npm react components',
|
||||||
' bundle: builds the javascript bundle for offline use'
|
' bundle: builds the javascript bundle for offline use',
|
||||||
|
' new-library: generates a native library bridge'
|
||||||
].join('\n'));
|
].join('\n'));
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
@@ -51,6 +53,9 @@ function run() {
|
|||||||
case 'bundle':
|
case 'bundle':
|
||||||
bundle.init(args);
|
bundle.init(args);
|
||||||
break;
|
break;
|
||||||
|
case 'new-library':
|
||||||
|
newLibrary.init(args);
|
||||||
|
break;
|
||||||
case 'init':
|
case 'init':
|
||||||
printInitWarning();
|
printInitWarning();
|
||||||
break;
|
break;
|
||||||
|
|||||||
47
local-cli/generator-utils.js
Normal file
47
local-cli/generator-utils.js
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
function copyAndReplace(src, dest, replacements) {
|
||||||
|
if (fs.lstatSync(src).isDirectory()) {
|
||||||
|
if (!fs.existsSync(dest)) {
|
||||||
|
fs.mkdirSync(dest);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var content = fs.readFileSync(src, 'utf8');
|
||||||
|
Object.keys(replacements).forEach(function(regex) {
|
||||||
|
content = content.replace(new RegExp(regex, 'g'), replacements[regex]);
|
||||||
|
});
|
||||||
|
fs.writeFileSync(dest, content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function walk(current) {
|
||||||
|
if (!fs.lstatSync(current).isDirectory()) {
|
||||||
|
return [current];
|
||||||
|
}
|
||||||
|
|
||||||
|
var files = fs.readdirSync(current).map(function(child) {
|
||||||
|
child = path.join(current, child);
|
||||||
|
return walk(child);
|
||||||
|
});
|
||||||
|
return [].concat.apply([current], files);
|
||||||
|
}
|
||||||
|
|
||||||
|
function validatePackageName(name) {
|
||||||
|
if (!name.match(/^[$A-Z_][0-9A-Z_$]*$/i)) {
|
||||||
|
console.error(
|
||||||
|
'"%s" is not a valid name for a project. Please use a valid identifier ' +
|
||||||
|
'name (alphanumeric).',
|
||||||
|
name
|
||||||
|
);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
copyAndReplace: copyAndReplace,
|
||||||
|
walk: walk,
|
||||||
|
validatePackageName: validatePackageName
|
||||||
|
};
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var fs = require('fs');
|
var utils = require('./generator-utils');
|
||||||
|
|
||||||
function init(projectDir, appName) {
|
function init(projectDir, appName) {
|
||||||
console.log('Setting up new React Native app in ' + projectDir);
|
console.log('Setting up new React Native app in ' + projectDir);
|
||||||
var source = path.resolve(__dirname, '..', 'Examples/SampleApp');
|
var source = path.resolve(__dirname, '..', 'Examples/SampleApp');
|
||||||
|
|
||||||
walk(source).forEach(function(f) {
|
utils.walk(source).forEach(function(f) {
|
||||||
f = f.replace(source + '/', ''); // Strip off absolute path
|
f = f.replace(source + '/', ''); // Strip off absolute path
|
||||||
if (f === 'project.xcworkspace' || f === 'xcuserdata') {
|
if (f === 'project.xcworkspace' || f.indexOf('.xcodeproj/xcuserdata') !== -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ function init(projectDir, appName) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
var dest = f.replace(/SampleApp/g, appName).replace(/^_/, '.');
|
var dest = f.replace(/SampleApp/g, appName).replace(/^_/, '.');
|
||||||
copyAndReplace(
|
utils.copyAndReplace(
|
||||||
path.resolve(source, f),
|
path.resolve(source, f),
|
||||||
path.resolve(projectDir, dest),
|
path.resolve(projectDir, dest),
|
||||||
replacements
|
replacements
|
||||||
@@ -34,30 +34,4 @@ function init(projectDir, appName) {
|
|||||||
console.log('');
|
console.log('');
|
||||||
}
|
}
|
||||||
|
|
||||||
function copyAndReplace(src, dest, replacements) {
|
|
||||||
if (fs.lstatSync(src).isDirectory()) {
|
|
||||||
if (!fs.existsSync(dest)) {
|
|
||||||
fs.mkdirSync(dest);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var content = fs.readFileSync(src, 'utf8');
|
|
||||||
Object.keys(replacements).forEach(function(regex) {
|
|
||||||
content = content.replace(new RegExp(regex, 'g'), replacements[regex]);
|
|
||||||
});
|
|
||||||
fs.writeFileSync(dest, content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function walk(current) {
|
|
||||||
if (!fs.lstatSync(current).isDirectory()) {
|
|
||||||
return [current];
|
|
||||||
}
|
|
||||||
|
|
||||||
var files = fs.readdirSync(current).map(function(child) {
|
|
||||||
child = path.join(current, child);
|
|
||||||
return walk(child);
|
|
||||||
});
|
|
||||||
return [].concat.apply([current], files);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = init;
|
module.exports = init;
|
||||||
|
|||||||
61
local-cli/new-library.js
Normal file
61
local-cli/new-library.js
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
var utils = require('./generator-utils');
|
||||||
|
|
||||||
|
function showHelp() {
|
||||||
|
console.log([
|
||||||
|
'Usage: react-native new-library <LibraryName>',
|
||||||
|
''
|
||||||
|
].join('\n'));
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function newLibrary(libraryName) {
|
||||||
|
var root = process.cwd();
|
||||||
|
var libraries = path.resolve(root, 'Libraries');
|
||||||
|
var libraryDest = path.resolve(libraries, libraryName);
|
||||||
|
var source = path.resolve('node_modules', 'react-native', 'Libraries', 'Sample') + '/';
|
||||||
|
|
||||||
|
if (!fs.existsSync(libraries)) {
|
||||||
|
fs.mkdir(libraries);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fs.existsSync(libraryDest)) {
|
||||||
|
console.log('Library already exists in', libraryDest);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.walk(source).forEach(function(f) {
|
||||||
|
f = f.replace(source, ''); // Strip off absolute path
|
||||||
|
if (f === 'project.xcworkspace' || f.indexOf('.xcodeproj/xcuserdata') !== -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dest = f.replace(/Sample/g, libraryName).replace(/^_/, '.');
|
||||||
|
utils.copyAndReplace(
|
||||||
|
path.resolve(source, f),
|
||||||
|
path.resolve(libraryDest, dest),
|
||||||
|
{ 'Sample': libraryName }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
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.html#content');
|
||||||
|
console.log('');
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
init: function(args) {
|
||||||
|
var libraryName = args[1];
|
||||||
|
if (!libraryName) {
|
||||||
|
showHelp();
|
||||||
|
}
|
||||||
|
utils.validatePackageName(libraryName);
|
||||||
|
|
||||||
|
newLibrary(libraryName);
|
||||||
|
}
|
||||||
|
};
|
||||||
6
react-native-cli/index.js
vendored
6
react-native-cli/index.js
vendored
@@ -55,7 +55,7 @@ if (cli) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function init(name) {
|
function validatePackageName(name) {
|
||||||
if (!name.match(/^[$A-Z_][0-9A-Z_$]*$/i)) {
|
if (!name.match(/^[$A-Z_][0-9A-Z_$]*$/i)) {
|
||||||
console.error(
|
console.error(
|
||||||
'"%s" is not a valid name for a project. Please use a valid identifier ' +
|
'"%s" is not a valid name for a project. Please use a valid identifier ' +
|
||||||
@@ -64,6 +64,10 @@ function init(name) {
|
|||||||
);
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init(name) {
|
||||||
|
validatePackageName(name);
|
||||||
|
|
||||||
var root = path.resolve(name);
|
var root = path.resolve(name);
|
||||||
var projectName = path.basename(root);
|
var projectName = path.basename(root);
|
||||||
|
|||||||
Reference in New Issue
Block a user