"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.action = action;
exports.default = _default;
function ConfigUtils() {
const data = _interopRequireWildcard(require("@expo/config"));
ConfigUtils = function () {
return data;
};
return data;
}
function _spawnAsync() {
const data = _interopRequireDefault(require("@expo/spawn-async"));
_spawnAsync = function () {
return data;
};
return data;
}
function _chalk() {
const data = _interopRequireDefault(require("chalk"));
_chalk = function () {
return data;
};
return data;
}
function _enquirer() {
const data = require("enquirer");
_enquirer = function () {
return data;
};
return data;
}
function _fsExtra() {
const data = _interopRequireDefault(require("fs-extra"));
_fsExtra = function () {
return data;
};
return data;
}
function _path() {
const data = _interopRequireDefault(require("path"));
_path = function () {
return data;
};
return data;
}
function _log() {
const data = _interopRequireDefault(require("../log"));
_log = function () {
return data;
};
return data;
}
function PackageManager() {
const data = _interopRequireWildcard(require("../PackageManager"));
PackageManager = function () {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
// @ts-ignore enquirer has no exported member 'MultiSelect'
async function maybeWarnToCommitAsync(projectRoot) {
let workingTreeStatus = 'unknown';
try {
const result = await (0, _spawnAsync().default)('git', ['status', '--porcelain']);
workingTreeStatus = result.stdout === '' ? 'clean' : 'dirty';
} catch (e) {// Maybe git is not installed?
// Maybe this project is not using git?
}
if (workingTreeStatus === 'dirty') {
(0, _log().default)(_chalk().default.yellow('You should commit your changes before generating code into the root of your project.'));
}
}
const dependencyMap = {
'babel.config.js': ['babel-preset-expo'],
'webpack.config.js': ['@expo/webpack-config']
};
async function generateFilesAsync({
projectDir,
staticPath,
options,
answer,
templateFolder
}) {
let promises = [];
for (const file of answer) {
if (Object.keys(dependencyMap).includes(file)) {
const projectFilePath = _path().default.resolve(projectDir, file); // copy the file from template
promises.push(_fsExtra().default.copy(require.resolve(_path().default.join('@expo/webpack-config/template', file)), projectFilePath, {
overwrite: true,
recursive: true
}));
if (file in dependencyMap) {
const packageManager = PackageManager().createForProject(projectDir);
for (const dependency of dependencyMap[file]) {
promises.push(packageManager.addDevAsync(dependency));
}
}
} else {
const fileName = _path().default.basename(file);
const src = _path().default.resolve(templateFolder, fileName);
const dest = _path().default.resolve(projectDir, staticPath, fileName);
if (await _fsExtra().default.pathExists(src)) {
promises.push(_fsExtra().default.copy(src, dest, {
overwrite: true,
recursive: true
}));
} else {
throw new Error(`Expected template file for ${fileName} doesn't exist at path: ${src}`);
}
}
}
await Promise.all(promises);
}
async function action(projectDir = './', options = {
force: false
}) {
const {
exp
} = await ConfigUtils().readConfigJsonAsync(projectDir);
const templateFolder = _path().default.dirname(require.resolve('@expo/webpack-config/web-default/index.html'));
const files = (await _fsExtra().default.readdir(templateFolder)).filter(item => item !== 'icon.png'); // { expo: { web: { staticPath: ... } } }
const {
web: {
staticPath = 'web'
} = {}
} = exp;
const allFiles = [...Object.keys(dependencyMap), ...files.map(file => _path().default.join(staticPath, file))];
let values = [];
for (const file of allFiles) {
const localProjectFile = _path().default.resolve(projectDir, file);
const exists = _fsExtra().default.existsSync(localProjectFile);
values.push({
name: file,
disabled: !options.force && exists ? '✔︎' : false,
message: options.force && exists ? _chalk().default.red(file) : file
});
}
if (!values.filter(({
disabled
}) => !disabled).length) {
(0, _log().default)(_chalk().default.yellow('\nAll of the custom web files already exist.') + '\nTo regenerate the files run:' + _chalk().default.bold(' expo customize:web --force\n'));
return;
}
await maybeWarnToCommitAsync(projectDir);
const prompt = new (_enquirer().MultiSelect)({
hint: '(Use <space> to select, <return> to submit)',
message: `Which files would you like to generate?`,
limit: values.length,
choices: values
});
let answer;
try {
answer = await prompt.run();
} catch (error) {
return;
}
await generateFilesAsync({
projectDir,
staticPath,
options,
answer,
templateFolder
});
}
function _default(program) {
program.command('customize:web [project-dir]').description('Generate static web files into your project.').option('-f, --force', 'Allows replacing existing files').allowOffline().asyncAction(action);
}
//# sourceMappingURL=../__sourcemaps__/commands/customize.js.map