92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
'use strict';
|
|
|
|
var chalk = require('chalk');
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var yeoman = require('yeoman-generator');
|
|
|
|
function validatePackageName(name) {
|
|
if (!name.match(/^([a-zA-Z_$][a-zA-Z\d_$]*\.)+([a-zA-Z_$][a-zA-Z\d_$]*)$/)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
module.exports = yeoman.generators.NamedBase.extend({
|
|
constructor: function() {
|
|
yeoman.generators.NamedBase.apply(this, arguments);
|
|
|
|
this.option('package', {
|
|
desc: 'Package name for the application (com.example.app)',
|
|
type: String,
|
|
defaults: 'com.' + this.name.toLowerCase()
|
|
});
|
|
this.option('upgrade', {
|
|
desc: 'Specify an upgrade',
|
|
type: Boolean,
|
|
defaults: false
|
|
});
|
|
},
|
|
|
|
initializing: function() {
|
|
if (!validatePackageName(this.options.package)) {
|
|
throw new Error('Package name ' + this.options.package + ' is invalid');
|
|
}
|
|
},
|
|
|
|
writing: function() {
|
|
var templateParams = {
|
|
package: this.options.package,
|
|
name: this.name
|
|
};
|
|
if (!this.options.upgrade) {
|
|
this.fs.copyTpl(
|
|
this.templatePath(path.join('src', '**')),
|
|
this.destinationPath('android'),
|
|
templateParams
|
|
);
|
|
this.fs.copy(
|
|
this.templatePath(path.join('bin', '**')),
|
|
this.destinationPath('android')
|
|
);
|
|
} else {
|
|
this.fs.copyTpl(
|
|
this.templatePath(path.join('src', '*')),
|
|
this.destinationPath('android'),
|
|
templateParams
|
|
);
|
|
this.fs.copyTpl(
|
|
this.templatePath(path.join('src', 'app', '*')),
|
|
this.destinationPath(path.join('android', 'app')),
|
|
templateParams
|
|
);
|
|
}
|
|
|
|
var javaPath = path.join.apply(
|
|
null,
|
|
['android', 'app', 'src', 'main', 'java'].concat(this.options.package.split('.'))
|
|
);
|
|
this.fs.copyTpl(
|
|
this.templatePath(path.join('package', '**')),
|
|
this.destinationPath(javaPath),
|
|
templateParams
|
|
);
|
|
},
|
|
|
|
end: function() {
|
|
var projectPath = this.destinationRoot();
|
|
this.log(chalk.white.bold('To run your app on Android:'));
|
|
this.log(chalk.white(' Have an Android emulator running (quickest way to get started), or a device connected'));
|
|
this.log(chalk.white(' cd ' + projectPath));
|
|
this.log(chalk.white(' react-native run-android'));
|
|
}
|
|
});
|