@sentry/wizard
Version:
Sentry wizard helping you to configure your project
260 lines • 11.5 kB
JavaScript
;
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