UNPKG

7.05 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8function _os() {
9 const data = _interopRequireDefault(require("os"));
10
11 _os = function () {
12 return data;
13 };
14
15 return data;
16}
17
18function _path() {
19 const data = _interopRequireDefault(require("path"));
20
21 _path = function () {
22 return data;
23 };
24
25 return data;
26}
27
28function _fsExtra() {
29 const data = _interopRequireDefault(require("fs-extra"));
30
31 _fsExtra = function () {
32 return data;
33 };
34
35 return data;
36}
37
38function _minimist() {
39 const data = _interopRequireDefault(require("minimist"));
40
41 _minimist = function () {
42 return data;
43 };
44
45 return data;
46}
47
48var _validate = require("./validate");
49
50var _DirectoryAlreadyExistsError = _interopRequireDefault(require("./errors/DirectoryAlreadyExistsError"));
51
52var _printRunInstructions = _interopRequireDefault(require("./printRunInstructions"));
53
54function _cliTools() {
55 const data = require("@react-native-community/cli-tools");
56
57 _cliTools = function () {
58 return data;
59 };
60
61 return data;
62}
63
64var _template = require("./template");
65
66var _editTemplate = require("./editTemplate");
67
68var PackageManager = _interopRequireWildcard(require("../../tools/packageManager"));
69
70var _installPods = _interopRequireDefault(require("../../tools/installPods"));
71
72var _banner = _interopRequireDefault(require("./banner"));
73
74var _loader = require("../../tools/loader");
75
76function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
77
78function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
79
80function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
81
82const DEFAULT_VERSION = 'latest';
83
84function doesDirectoryExist(dir) {
85 return _fsExtra().default.existsSync(dir);
86}
87
88async function setProjectDirectory(directory) {
89 if (doesDirectoryExist(directory)) {
90 throw new _DirectoryAlreadyExistsError.default(directory);
91 }
92
93 try {
94 _fsExtra().default.mkdirSync(directory, {
95 recursive: true
96 });
97
98 process.chdir(directory);
99 } catch (error) {
100 throw new (_cliTools().CLIError)('Error occurred while trying to create project directory.', error);
101 }
102
103 return process.cwd();
104}
105
106function getTemplateName(cwd) {
107 // We use package manager to infer the name of the template module for us.
108 // That's why we get it from temporary package.json, where the name is the
109 // first and only dependency (hence 0).
110 const name = Object.keys(JSON.parse(_fsExtra().default.readFileSync(_path().default.join(cwd, './package.json'), 'utf8')).dependencies)[0];
111 return name;
112}
113
114async function createFromTemplate({
115 projectName,
116 templateUri,
117 npm,
118 directory,
119 projectTitle,
120 skipInstall
121}) {
122 _cliTools().logger.debug('Initializing new project');
123
124 _cliTools().logger.log(_banner.default);
125
126 const projectDirectory = await setProjectDirectory(directory);
127 const Loader = (0, _loader.getLoader)();
128 const loader = new Loader({
129 text: 'Downloading template'
130 });
131
132 const templateSourceDir = _fsExtra().default.mkdtempSync(_path().default.join(_os().default.tmpdir(), 'rncli-init-template-'));
133
134 try {
135 loader.start();
136 await (0, _template.installTemplatePackage)(templateUri, templateSourceDir, npm);
137 loader.succeed();
138 loader.start('Copying template');
139 const templateName = getTemplateName(templateSourceDir);
140 const templateConfig = (0, _template.getTemplateConfig)(templateName, templateSourceDir);
141 await (0, _template.copyTemplate)(templateName, templateConfig.templateDir, templateSourceDir);
142 loader.succeed();
143 loader.start('Processing template');
144 await (0, _editTemplate.changePlaceholderInTemplate)({
145 projectName,
146 projectTitle,
147 placeholderName: templateConfig.placeholderName,
148 placeholderTitle: templateConfig.titlePlaceholder
149 });
150 loader.succeed();
151 const {
152 postInitScript
153 } = templateConfig;
154
155 if (postInitScript) {
156 // Leaving trailing space because there may be stdout from the script
157 loader.start('Executing post init script ');
158 await (0, _template.executePostInitScript)(templateName, postInitScript, templateSourceDir);
159 loader.succeed();
160 }
161
162 if (!skipInstall) {
163 await installDependencies({
164 npm,
165 loader,
166 root: projectDirectory,
167 directory
168 });
169 } else {
170 loader.succeed('Dependencies installation skipped');
171 }
172 } catch (e) {
173 loader.fail();
174 throw new Error(e);
175 } finally {
176 _fsExtra().default.removeSync(templateSourceDir);
177 }
178}
179
180async function installDependencies({
181 directory,
182 npm,
183 loader,
184 root
185}) {
186 loader.start('Installing dependencies');
187 await PackageManager.installAll({
188 preferYarn: !npm,
189 silent: true,
190 root
191 });
192
193 if (process.platform === 'darwin') {
194 await (0, _installPods.default)({
195 directory,
196 loader
197 });
198 }
199
200 loader.succeed();
201}
202
203async function createProject(projectName, directory, version, options) {
204 const templateUri = options.template || `react-native@${version}`;
205 return createFromTemplate({
206 projectName,
207 templateUri,
208 npm: options.npm,
209 directory,
210 projectTitle: options.title,
211 skipInstall: options.skipInstall
212 });
213}
214
215var initialize = async function initialize([projectName], options) {
216 const root = process.cwd();
217 (0, _validate.validateProjectName)(projectName);
218 /**
219 * Commander is stripping `version` from options automatically.
220 * We have to use `minimist` to take that directly from `process.argv`
221 */
222
223 const version = (0, _minimist().default)(process.argv).version || DEFAULT_VERSION;
224
225 const directoryName = _path().default.relative(root, options.directory || projectName);
226
227 try {
228 await createProject(projectName, directoryName, version, options);
229
230 const projectFolder = _path().default.join(root, directoryName);
231
232 (0, _printRunInstructions.default)(projectFolder, projectName);
233 } catch (e) {
234 _cliTools().logger.error(e.message);
235 }
236};
237
238exports.default = initialize;
239
240//# sourceMappingURL=init.js.map
\No newline at end of file