react-native-integrate
Version:
Automate integration of additional code into React Native projects
80 lines (79 loc) • 3.92 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyAddPreBuildRunScriptAction = applyAddPreBuildRunScriptAction;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const xml2js_1 = __importDefault(require("xml2js"));
const constants_1 = require("../../constants");
const prompter_1 = require("../../prompter");
const getIosProjectPath_1 = require("../../utils/getIosProjectPath");
const getModContent_1 = require("../../utils/getModContent");
async function applyAddPreBuildRunScriptAction(content, action, configPath, packageName) {
let scriptContent = await (0, getModContent_1.getModContent)(configPath, packageName, action.addPreBuildRunScriptAction);
const projectName = (0, getIosProjectPath_1.getIosProjectName)();
const iosProjectPath = (0, getIosProjectPath_1.getIosProjectPath)();
const schemePath = path_1.default.join(iosProjectPath + '.xcodeproj', 'xcshareddata', 'xcschemes', `${projectName}.xcscheme`);
let xmlData = fs_1.default.readFileSync(schemePath, 'utf8');
const parser = new xml2js_1.default.Parser({
preserveChildrenOrder: true,
});
const jObj = await parser.parseStringPromise(xmlData); // parser.parse(xmlData);
// existing check
const buildAction = jObj.Scheme.BuildAction;
let preActions = buildAction[0].PreActions;
if (!preActions) {
buildAction[0].PreActions = [];
preActions = buildAction[0].PreActions;
}
/* eslint-disable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return */
if (preActions.some((x) => x.ExecutionAction?.some((ea) => ea.ActionContent?.some((ac) => ac.$?.scriptText?.includes(scriptContent))))) {
/* eslint-enable @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return */
(0, prompter_1.logMessageGray)(`code already exists, skipped appending script: ${(0, prompter_1.summarize)(scriptContent)}`);
return content;
}
if (!scriptContent.endsWith('\n'))
scriptContent += '\n';
const nativeTarget = content.getTarget(constants_1.Constants.XCODE_APPLICATION_TYPE);
preActions.push({
ExecutionAction: [
{
$: {
ActionType: 'Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction',
},
ActionContent: [
{
$: {
title: 'Run Script',
scriptText: scriptContent,
},
EnvironmentBuildable: [
{
BuildableReference: [
{
$: {
BuildableIdentifier: 'primary',
BlueprintIdentifier: nativeTarget.uuid,
BuildableName: nativeTarget.target.productReference_comment,
BlueprintName: nativeTarget.target.name,
ReferencedContainer: `container:${projectName}.xcodeproj`,
},
},
],
},
],
},
],
},
],
});
const builder = new xml2js_1.default.Builder({
allowSurrogateChars: true,
renderOpts: { pretty: true, indent: ' ', newline: '\n' },
});
xmlData = builder.buildObject(jObj);
fs_1.default.writeFileSync(schemePath, xmlData);
return content;
}