UNPKG

@sentry/wizard

Version:

Sentry wizard helping you to configure your project

260 lines 11.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.XcodeProject = void 0; /* eslint-disable max-lines */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-call */ // @ts-ignore - clack is ESM and TS complains about that. It works though var prompts_1 = __importDefault(require("@clack/prompts")); var fs = __importStar(require("fs")); var templates = __importStar(require("./templates")); var path = __importStar(require("path")); var xcode = require('xcode'); function setDebugInformationFormatAndSandbox(proj, targetName) { var xcObjects = proj.hash.project.objects; var targetKey = Object.keys(xcObjects.PBXNativeTarget || {}).filter(function (key) { return (!key.endsWith('_comment') && xcObjects.PBXNativeTarget[key].name === targetName); })[0]; var target = xcObjects.PBXNativeTarget[targetKey]; xcObjects.XCConfigurationList[target.buildConfigurationList].buildConfigurations.forEach(function (buildConfig) { var buildSettings = xcObjects.XCBuildConfiguration[buildConfig.value].buildSettings; buildSettings.DEBUG_INFORMATION_FORMAT = '"dwarf-with-dsym"'; buildSettings.ENABLE_USER_SCRIPT_SANDBOXING = '"NO"'; }); } function addSentrySPM(proj, targetName) { var xcObjects = proj.hash.project.objects; var sentryFrameworkUUID = proj.generateUuid(); var sentrySPMUUID = proj.generateUuid(); //Check whether xcObjects already have sentry framework if (xcObjects.PBXFrameworksBuildPhase) { for (var key in xcObjects.PBXFrameworksBuildPhase || {}) { if (!key.endsWith('_comment')) { var frameworks = xcObjects.PBXFrameworksBuildPhase[key].files; for (var _i = 0, frameworks_1 = frameworks; _i < frameworks_1.length; _i++) { var framework = frameworks_1[_i]; if (framework.comment === 'Sentry in Frameworks') { return; } } } } } xcObjects.PBXBuildFile[sentryFrameworkUUID] = { isa: 'PBXBuildFile', productRef: sentrySPMUUID, productRef_comment: 'Sentry', }; xcObjects.PBXBuildFile[sentryFrameworkUUID + '_comment'] = 'Sentry in Frameworks'; for (var key in xcObjects.PBXFrameworksBuildPhase || {}) { if (!key.endsWith('_comment')) { var frameworks = xcObjects.PBXFrameworksBuildPhase[key].files; frameworks.push({ value: sentryFrameworkUUID, comment: 'Sentry in Frameworks', }); } } var targetKey = Object.keys(xcObjects.PBXNativeTarget || {}).filter(function (key) { return (!key.endsWith('_comment') && xcObjects.PBXNativeTarget[key].name === targetName); })[0]; var target = xcObjects.PBXNativeTarget[targetKey]; if (!target.packageProductDependencies) { target.packageProductDependencies = []; } target.packageProductDependencies.push({ value: sentrySPMUUID, comment: 'Sentry', }); var sentrySwiftPackageUUID = proj.generateUuid(); var xcProject = proj.getFirstProject().firstProject; if (!xcProject.packageReferences) { xcProject.packageReferences = []; } xcProject.packageReferences.push({ value: sentrySwiftPackageUUID, comment: 'XCRemoteSwiftPackageReference "sentry-cocoa"', }); if (!xcObjects.XCRemoteSwiftPackageReference) { xcObjects.XCRemoteSwiftPackageReference = {}; } xcObjects.XCRemoteSwiftPackageReference[sentrySwiftPackageUUID] = { isa: 'XCRemoteSwiftPackageReference', repositoryURL: '"https://github.com/getsentry/sentry-cocoa/"', requirement: { kind: 'upToNextMajorVersion', minimumVersion: '8.0.0', }, }; xcObjects.XCRemoteSwiftPackageReference[sentrySwiftPackageUUID + '_comment'] = 'XCRemoteSwiftPackageReference "sentry-cocoa"'; if (!xcObjects.XCSwiftPackageProductDependency) { xcObjects.XCSwiftPackageProductDependency = {}; } xcObjects.XCSwiftPackageProductDependency[sentrySPMUUID] = { isa: 'XCSwiftPackageProductDependency', package: sentrySwiftPackageUUID, package_comment: 'XCRemoteSwiftPackageReference "sentry-cocoa"', productName: 'Sentry', }; xcObjects.XCSwiftPackageProductDependency[sentrySPMUUID + '_comment'] = 'Sentry'; prompts_1.default.log.step('Added Sentry SPM dependency to your project'); } function addUploadSymbolsScript(xcodeProject, sentryProject, targetName, uploadSource) { if (uploadSource === void 0) { uploadSource = true; } var xcObjects = xcodeProject.hash.project.objects; var targetKey = Object.keys(xcObjects.PBXNativeTarget || {}).filter(function (key) { return (!key.endsWith('_comment') && xcObjects.PBXNativeTarget[key].name === targetName); })[0]; for (var scriptKey in xcObjects.PBXShellScriptBuildPhase || {}) { if (!scriptKey.endsWith('_comment')) { var script = xcObjects.PBXShellScriptBuildPhase[scriptKey].shellScript; //Sentry script already exists, update it if (script.includes('sentry-cli')) { delete xcObjects.PBXShellScriptBuildPhase[scriptKey]; delete xcObjects.PBXShellScriptBuildPhase[scriptKey + '_comment']; break; } } } xcodeProject.addBuildPhase([], 'PBXShellScriptBuildPhase', 'Upload Debug Symbols to Sentry', targetKey, { inputFileListPaths: [], outputFileListPaths: [], inputPaths: [templates.scriptInputPath], shellPath: '/bin/sh', shellScript: templates.getRunScriptTemplate(sentryProject.organization.slug, sentryProject.slug, uploadSource), }); prompts_1.default.log.step("Added Sentry upload script to \"".concat(targetName, "\" build phase")); } var XcodeProject = /** @class */ (function () { function XcodeProject(projectPath) { this.projectPath = projectPath; this.project = xcode.project(projectPath); this.project.parseSync(); this.objects = this.project.hash.project.objects; } XcodeProject.prototype.getAllTargets = function () { var _this = this; return Object.keys(this.objects.PBXNativeTarget || {}) .filter(function (key) { return (!key.endsWith('_comment') && _this.objects.PBXNativeTarget[key].productType.startsWith('"com.apple.product-type.application')); }) .map(function (key) { return _this.objects.PBXNativeTarget[key].name; }); }; XcodeProject.prototype.updateXcodeProject = function (sentryProject, target, apiKeys, addSPMReference, uploadSource) { if (uploadSource === void 0) { uploadSource = true; } addUploadSymbolsScript(this.project, sentryProject, target, uploadSource); if (uploadSource) { setDebugInformationFormatAndSandbox(this.project, target); } if (addSPMReference) { addSentrySPM(this.project, target); } var newContent = this.project.writeSync(); fs.writeFileSync(this.projectPath, newContent); }; XcodeProject.prototype.filesForTarget = function (target) { var _this = this; var files = this.projectFiles(); var fileDictionary = {}; files.forEach(function (file) { fileDictionary[file.key] = file.path; }); var nativeTarget = Object.keys(this.objects.PBXNativeTarget || {}).filter(function (key) { return (!key.endsWith('_comment') && _this.objects.PBXNativeTarget[key].name === target); })[0]; if (nativeTarget === undefined) { return undefined; } var buildPhaseKey = this.objects.PBXNativeTarget[nativeTarget].buildPhases.filter(function (phase) { return _this.objects.PBXSourcesBuildPhase[phase.value] !== undefined; })[0]; if (buildPhaseKey === undefined) { return undefined; } var buildPhases = this.objects.PBXSourcesBuildPhase[buildPhaseKey.value]; if (buildPhases === undefined) { return undefined; } var baseDir = path.dirname(path.dirname(this.projectPath)); return buildPhases.files .map(function (file) { var buildFile = fileDictionary[_this.objects.PBXBuildFile[file.value].fileRef]; if (!buildFile) { return ''; } return path.join(baseDir, buildFile); }) .filter(function (f) { return f.length > 0; }); }; XcodeProject.prototype.projectFiles = function () { if (this.files === undefined) { var proj = this.project.getFirstProject(); var mainGroupKey = proj.firstProject.mainGroup; var mainGroup = this.objects.PBXGroup[mainGroupKey]; this.files = this.buildGroup(mainGroup); } return this.files; }; XcodeProject.prototype.buildGroup = function (group, path) { if (path === void 0) { path = ''; } var result = []; for (var _i = 0, _a = group.children; _i < _a.length; _i++) { var child = _a[_i]; if (this.objects.PBXFileReference[child.value]) { var fileReference = this.objects.PBXFileReference[child.value]; result.push({ key: child.value, path: "".concat(path).concat(fileReference.path.replace(/"/g, '')), }); } else if (this.objects.PBXGroup[child.value]) { var groupReference = this.objects.PBXGroup[child.value]; var groupChildren = this.buildGroup(groupReference, groupReference.path ? "".concat(path).concat(groupReference.path.replace(/"/g, ''), "/") : path); result.push.apply(result, groupChildren); } } return result; }; return XcodeProject; }()); exports.XcodeProject = XcodeProject; //# sourceMappingURL=xcode-manager.js.map