UNPKG

react-native-integrate

Version:

Automate integration of additional code into React Native projects

80 lines (79 loc) 3.92 kB
"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; }