react-native-integrate
Version:
Automate integration of additional code into React Native projects
117 lines (116 loc) • 4.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.summary = void 0;
exports.xcodeTask = xcodeTask;
exports.runTask = runTask;
const fs_1 = __importDefault(require("fs"));
const xcode_1 = __importDefault(require("xcode"));
const checkCondition_1 = require("../../utils/checkCondition");
const getErrMessage_1 = require("../../utils/getErrMessage");
const getIosProjectPath_1 = require("../../utils/getIosProjectPath");
const processScript_1 = require("../../utils/processScript");
const setState_1 = require("../../utils/setState");
const xcode_context_1 = require("../../utils/xcode.context");
const variables_1 = require("../../variables");
const xcodeTask_addCapability_1 = require("./xcodeTask.addCapability");
const xcodeTask_addConfiguration_1 = require("./xcodeTask.addConfiguration");
const xcodeTask_addFile_1 = require("./xcodeTask.addFile");
const xcodeTask_addPreBuildRunScriptAction_1 = require("./xcodeTask.addPreBuildRunScriptAction");
const xcodeTask_addTarget_1 = require("./xcodeTask.addTarget");
const xcodeTask_setDeploymentVersion_1 = require("./xcodeTask.setDeploymentVersion");
async function xcodeTask(args) {
let { content } = args;
const { task, configPath, packageName } = args;
for (const action of task.actions) {
if (action.when && !(0, checkCondition_1.checkCondition)(action.when)) {
(0, setState_1.setState)(action.name, {
state: 'skipped',
reason: 'when',
});
continue;
}
(0, setState_1.setState)(action.name, {
state: 'progress',
});
try {
content = await applyXcodeModification(content, action, configPath, packageName);
(0, setState_1.setState)(action.name, {
state: 'done',
});
}
catch (e) {
(0, setState_1.setState)(action.name, {
state: 'error',
reason: (0, getErrMessage_1.getErrMessage)(e),
});
throw e;
}
}
return content;
}
async function applyXcodeModification(content, action, configPath, packageName) {
if ('addFile' in action)
return (0, xcodeTask_addFile_1.applyAddFile)(content, action, packageName);
if ('addTarget' in action)
return (0, xcodeTask_addTarget_1.applyAddTarget)(content, action, packageName);
if ('addCapability' in action)
return (0, xcodeTask_addCapability_1.applyAddCapability)(content, action);
if ('setDeploymentVersion' in action)
return (0, xcodeTask_setDeploymentVersion_1.applySetDeploymentVersion)(content, action);
if ('addConfiguration' in action)
return (0, xcodeTask_addConfiguration_1.applyAddConfiguration)(content, action, configPath, packageName);
if ('addPreBuildRunScriptAction' in action)
return (0, xcodeTask_addPreBuildRunScriptAction_1.applyAddPreBuildRunScriptAction)(content, action, configPath, packageName);
if ('script' in action) {
if (typeof action.script === 'string') {
const resultValue = await (0, processScript_1.processScript)(action.script, variables_1.variables, false, true, {
project: content,
});
if (action.name && resultValue != null)
variables_1.variables.set(action.name, resultValue);
}
else {
const resultValue = await action.script(content);
if (action.name && resultValue != null)
variables_1.variables.set(action.name, resultValue);
}
return content;
}
return content;
}
function getPbxProjPath() {
const pbxFilePath = (0, getIosProjectPath_1.getPbxProjectPath)();
if (!fs_1.default.existsSync(pbxFilePath)) {
// noinspection SpellCheckingInspection
throw new Error(`project.pbxproj file not found at ${pbxFilePath}`);
}
return pbxFilePath;
}
function readPbxProjContent() {
const pbxFilePath = getPbxProjPath();
const proj = xcode_1.default.project(pbxFilePath);
proj.parseSync();
return proj;
}
function writePbxProjContent(proj) {
const appDelegatePath = getPbxProjPath();
return fs_1.default.writeFileSync(appDelegatePath, proj.writeSync(), 'utf-8');
}
async function runTask(args) {
let content = readPbxProjContent();
try {
xcode_context_1.xcodeContext.set(content);
content = await xcodeTask({
...args,
content,
});
writePbxProjContent(content);
}
finally {
xcode_context_1.xcodeContext.clear();
}
}
exports.summary = 'Xcode project modification';