UNPKG

code-push

Version:

Management SDK for the CodePush service

533 lines (532 loc) 26.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var request_manager_1 = __importDefault(require("../request-manager")); var Adapter = /** @class */ (function () { function Adapter(_requestManager) { this._requestManager = _requestManager; } Adapter.prototype.toLegacyAccount = function (profile) { return { name: profile.name, email: profile.email, linkedProviders: [] }; }; Adapter.prototype.toLegacyAccessKey = function (apiToken) { var accessKey = { createdTime: Date.parse(apiToken.created_at), expires: Date.parse('9999-12-31T23:59:59'), key: apiToken.api_token, name: apiToken.description }; return accessKey; }; Adapter.prototype.toLegacyAccessKeyList = function (apiTokens) { console.log(apiTokens); var accessKeyList = apiTokens.map(function (apiToken) { var accessKey = { createdTime: Date.parse(apiToken.created_at), expires: Date.parse('9999-12-31T23:59:59'), name: apiToken.description, }; return accessKey; }); accessKeyList.sort(function (first, second) { var firstTime = first.createdTime || 0; var secondTime = second.createdTime || 0; return firstTime - secondTime; }); return accessKeyList; }; Adapter.prototype.toLegacyApp = function (app) { return __awaiter(this, void 0, void 0, function () { var _a, user, deployments, deploymentsNames; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, Promise.all([this.getUser(), this.getDeployments(app.owner.name, app.name)])]; case 1: _a = _b.sent(), user = _a[0], deployments = _a[1]; deploymentsNames = deployments.map(function (deployment) { return deployment.name; }); return [2 /*return*/, this.toLegacyRestApp(app, user, deploymentsNames)]; } }); }); }; ; Adapter.prototype.toLegacyApps = function (apps) { return __awaiter(this, void 0, void 0, function () { var user, sortedApps, legacyApps; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getUser()]; case 1: user = _a.sent(); return [4 /*yield*/, Promise.all(apps.sort(function (first, second) { var firstOwner = first.owner.name || ''; var secondOwner = second.owner.name || ''; // First sort by owner, then by app name if (firstOwner !== secondOwner) { return firstOwner.localeCompare(secondOwner); } else { return first.name.localeCompare(second.name); } }))]; case 2: sortedApps = _a.sent(); return [4 /*yield*/, Promise.all(sortedApps.map(function (app) { return __awaiter(_this, void 0, void 0, function () { var deployments, deploymentsNames; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getDeployments(app.owner.name, app.name)]; case 1: deployments = _a.sent(); deploymentsNames = deployments.map(function (deployment) { return deployment.name; }); return [2 /*return*/, this.toLegacyRestApp(app, user, deploymentsNames)]; } }); }); }))]; case 3: legacyApps = _a.sent(); return [2 /*return*/, legacyApps]; } }); }); }; ; Adapter.prototype.toApigatewayAppCreationRequest = function (appToCreate) { if (appToCreate.os !== 'iOS' && appToCreate.os !== 'Android' && appToCreate.os !== 'Windows' && appToCreate.os !== 'Linux') { throw this.getCodePushError("The app OS \"".concat(appToCreate.os, "\" isn't valid. It should be \"iOS\", \"Android\", \"Windows\" or \"Linux\"."), request_manager_1.default.ERROR_CONFLICT); } if (appToCreate.platform !== 'React-Native' && appToCreate.platform !== 'Cordova' && appToCreate.platform !== 'Electron') { throw this.getCodePushError("The app platform \"".concat(appToCreate.platform, "\" isn't valid. It should be \"React-Native\", \"Cordova\" or \"Electron\"."), request_manager_1.default.ERROR_CONFLICT); } var org = this.getOrgFromLegacyAppRequest(appToCreate); var appcenterClientApp = this.toAppcenterClientApp(appToCreate); if (!this.isValidAppCenterAppName(appcenterClientApp.display_name)) { throw this.getCodePushError("The app name \"".concat(appcenterClientApp.display_name, "\" isn't valid. It can only contain alphanumeric characters, dashes, periods, or underscores."), request_manager_1.default.ERROR_CONFLICT); } return { org: org, appcenterClientApp: appcenterClientApp }; }; Adapter.prototype.addStandardDeployments = function (apiAppName) { return __awaiter(this, void 0, void 0, function () { var _a, appOwner, appName, deploymentsToCreate; var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.parseApiAppName(apiAppName)]; case 1: _a = _b.sent(), appOwner = _a.appOwner, appName = _a.appName; deploymentsToCreate = ['Staging', 'Production']; return [4 /*yield*/, Promise.all(deploymentsToCreate.map(function (deploymentName) { return __awaiter(_this, void 0, void 0, function () { var deployment; return __generator(this, function (_a) { switch (_a.label) { case 0: deployment = { name: deploymentName }; return [4 /*yield*/, this._requestManager.post("/apps/".concat(appOwner, "/").concat(appName, "/deployments/"), JSON.stringify(deployment), /*expectResponseBody=*/ true)]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }))]; case 2: _b.sent(); return [2 /*return*/]; } }); }); }; ; Adapter.prototype.getRenamedApp = function (newName, appOwner, oldName) { return __awaiter(this, void 0, void 0, function () { var app, updatedApp; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getApp(appOwner, oldName)]; case 1: app = _a.sent(); if (newName.indexOf('/') !== -1) { throw this.getCodePushError("The new app name \"".concat(newName, "\" must be unqualified, not having a '/' character."), request_manager_1.default.ERROR_CONFLICT); } if (!this.isValidAppCenterAppName(newName)) { throw this.getCodePushError("The app name \"".concat(newName, "\" isn't valid. It can only contain alphanumeric characters, dashes, periods, or underscores."), request_manager_1.default.ERROR_CONFLICT); } updatedApp = app.name === app.display_name ? { name: newName, display_name: newName } : { name: newName }; return [2 /*return*/, updatedApp]; } }); }); }; Adapter.prototype.resolveAccessKey = function (accessKeyName) { return __awaiter(this, void 0, void 0, function () { var accessKeys, foundAccessKey; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getApiTokens()]; case 1: accessKeys = _a.sent(); foundAccessKey = accessKeys.find(function (key) { return key.description === accessKeyName; }); if (!foundAccessKey) { throw this.getCodePushError("Access key \"".concat(accessKeyName, "\" does not exist."), request_manager_1.default.ERROR_NOT_FOUND); } return [2 /*return*/, foundAccessKey]; } }); }); }; Adapter.prototype.toLegacyDeployments = function (deployments) { deployments.sort(function (first, second) { return first.name.localeCompare(second.name); }); return this.toLegacyRestDeployments(deployments); }; ; Adapter.prototype.toLegacyDeployment = function (deployment) { return this.toLegacyRestDeployment(deployment); }; ; Adapter.prototype.toLegacyCollaborators = function (userList, appOwner) { return __awaiter(this, void 0, void 0, function () { var callingUser, legacyCollaborators; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getUser()]; case 1: callingUser = _a.sent(); legacyCollaborators = {}; userList.forEach(function (user) { legacyCollaborators[user.email] = { isCurrentAccount: callingUser.email === user.email, permission: _this.toLegacyUserPermission(user.permissions[0], user.name && user.name === appOwner) }; }); return [2 /*return*/, legacyCollaborators]; } }); }); }; Adapter.prototype.toLegacyDeploymentMetrics = function (deploymentMetrics) { return __awaiter(this, void 0, void 0, function () { var legacyDeploymentMetrics; return __generator(this, function (_a) { legacyDeploymentMetrics = {}; deploymentMetrics.forEach(function (deployment) { legacyDeploymentMetrics[deployment.label] = { active: deployment.active, downloaded: deployment.downloaded, failed: deployment.failed, installed: deployment.installed }; }); return [2 /*return*/, legacyDeploymentMetrics]; }); }); }; Adapter.prototype.parseApiAppName = function (apiAppName) { return __awaiter(this, void 0, void 0, function () { var callingUser, _a, appOwner, appName; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.getUser()]; case 1: callingUser = _b.sent(); // If the separating / is not included, assume the owner is the calling user and only the app name is provided if (!apiAppName.includes("/")) { return [2 /*return*/, { appOwner: callingUser.name, appName: apiAppName, }]; } _a = apiAppName.split("/"), appOwner = _a[0], appName = _a[1]; return [2 /*return*/, { appOwner: appOwner, appName: appName, }]; } }); }); }; Adapter.prototype.toLegacyDeploymentHistory = function (releases) { var _this = this; return releases.map(function (release) { return _this.releaseToPackage(release); }); }; Adapter.prototype.toLegacyRestApp = function (app, user, deployments) { var _a; var isCurrentAccount = user.id === app.owner.id; var isNameAndDisplayNameSame = app.name === app.display_name; var appName = app.name; if (!isCurrentAccount) { appName = app.owner.name + '/' + app.name; } if (!isNameAndDisplayNameSame) { appName += " (".concat(app.display_name, ")"); } return { name: appName, collaborators: (_a = {}, _a[app.owner.name] = { isCurrentAccount: user.id === app.owner.id, permission: 'Owner' }, _a), deployments: deployments, os: app.os, platform: app.platform }; }; Adapter.prototype.toReleaseUploadProperties = function (updateMetadata, releaseUploadAssets, deploymentName) { var releaseUpload = { release_upload: releaseUploadAssets, target_binary_version: updateMetadata.appVersion, deployment_name: deploymentName, no_duplicate_release_error: false, // This property is not implemented in CodePush SDK Management }; if (updateMetadata.description) releaseUpload.description = updateMetadata.description; if (updateMetadata.isDisabled) releaseUpload.disabled = updateMetadata.isDisabled; if (updateMetadata.isMandatory) releaseUpload.mandatory = updateMetadata.isMandatory; if (updateMetadata.rollout) releaseUpload.rollout = updateMetadata.rollout; return releaseUpload; }; Adapter.prototype.toRestReleaseModification = function (legacyCodePushReleaseInfo) { var releaseModification = {}; if (legacyCodePushReleaseInfo.appVersion) releaseModification.target_binary_range = legacyCodePushReleaseInfo.appVersion; if (legacyCodePushReleaseInfo.isDisabled) releaseModification.is_disabled = legacyCodePushReleaseInfo.isDisabled; if (legacyCodePushReleaseInfo.isMandatory !== undefined) releaseModification.is_mandatory = legacyCodePushReleaseInfo.isMandatory === true; if (legacyCodePushReleaseInfo.description) releaseModification.description = legacyCodePushReleaseInfo.description; if (legacyCodePushReleaseInfo.rollout) releaseModification.rollout = legacyCodePushReleaseInfo.rollout; if (legacyCodePushReleaseInfo.label) releaseModification.label = legacyCodePushReleaseInfo.label; return releaseModification; }; Adapter.prototype.releaseToPackage = function (releasePackage) { var sdkPackage = { blobUrl: releasePackage.blob_url, size: releasePackage.size, uploadTime: releasePackage.upload_time, isDisabled: !!releasePackage.is_disabled, isMandatory: !!releasePackage.is_mandatory, }; if (releasePackage.target_binary_range) sdkPackage.appVersion = releasePackage.target_binary_range; if (releasePackage.description) sdkPackage.description = releasePackage.description; if (releasePackage.label) sdkPackage.label = releasePackage.label; if (releasePackage.package_hash) sdkPackage.packageHash = releasePackage.package_hash; if (releasePackage.rollout) sdkPackage.rollout = releasePackage.rollout; if (releasePackage.diff_package_map) sdkPackage.diffPackageMap = releasePackage.diff_package_map; if (releasePackage.original_label) sdkPackage.originalLabel = releasePackage.original_label; if (releasePackage.original_deployment) sdkPackage.originalDeployment = releasePackage.original_deployment; if (releasePackage.released_by) sdkPackage.releasedBy = releasePackage.released_by; if (releasePackage.release_method) sdkPackage.releaseMethod = releasePackage.release_method; return sdkPackage; }; Adapter.prototype.toLegacyRestDeployments = function (apiGatewayDeployments) { var _this = this; var deployments = apiGatewayDeployments.map(function (deployment) { return _this.toLegacyRestDeployment(deployment); }); return deployments; }; Adapter.prototype.toLegacyRestDeployment = function (deployment) { var apiGatewayPackage = deployment.latest_release ? this.releaseToPackage(deployment.latest_release) : null; var restDeployment = { name: deployment.name, key: deployment.key, package: apiGatewayPackage }; return restDeployment; }; Adapter.prototype.getUser = function () { return __awaiter(this, void 0, void 0, function () { var res, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this._requestManager.get("/user")]; case 1: res = _a.sent(); return [2 /*return*/, res.body]; case 2: error_1 = _a.sent(); throw error_1; case 3: return [2 /*return*/]; } }); }); }; Adapter.prototype.getApiTokens = function () { return __awaiter(this, void 0, void 0, function () { var res, error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this._requestManager.get("/api_tokens")]; case 1: res = _a.sent(); return [2 /*return*/, res.body]; case 2: error_2 = _a.sent(); throw error_2; case 3: return [2 /*return*/]; } }); }); }; Adapter.prototype.getApp = function (appOwner, appName) { return __awaiter(this, void 0, void 0, function () { var res, error_3; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this._requestManager.get("/apps/".concat(appOwner, "/").concat(appName))]; case 1: res = _a.sent(); return [2 /*return*/, res.body]; case 2: error_3 = _a.sent(); throw error_3; case 3: return [2 /*return*/]; } }); }); }; Adapter.prototype.getDeployments = function (appOwner, appName) { return __awaiter(this, void 0, void 0, function () { var res, error_4; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this._requestManager.get("/apps/".concat(appOwner, "/").concat(appName, "/deployments/"))]; case 1: res = _a.sent(); return [2 /*return*/, res.body]; case 2: error_4 = _a.sent(); throw error_4; case 3: return [2 /*return*/]; } }); }); }; Adapter.prototype.toLegacyUserPermission = function (expectedPermission, isOwner) { if (expectedPermission === 'manager') { return isOwner ? 'Owner' : 'Manager'; } else if (expectedPermission === 'developer') { return 'Collaborator'; } return 'Reader'; }; Adapter.prototype.getOrgFromLegacyAppRequest = function (legacyCreateAppRequest) { var slashIndex = legacyCreateAppRequest.name.indexOf('/'); var org = slashIndex !== -1 ? legacyCreateAppRequest.name.substring(0, slashIndex) : null; return org; }; Adapter.prototype.toAppcenterClientApp = function (legacyCreateAppRequest) { // If the app name contains a slash, then assume that the app is intended to be owned by an org, with the org name // before the slash. Update the app info accordingly. var slashIndex = legacyCreateAppRequest.name.indexOf('/'); return { os: legacyCreateAppRequest.os, platform: legacyCreateAppRequest.platform, display_name: slashIndex !== -1 ? legacyCreateAppRequest.name.substring(slashIndex + 1) : legacyCreateAppRequest.name }; }; Adapter.prototype.isValidAppCenterAppName = function (name) { return this.getStringValidator(/*maxLength=*/ 1000, /*minLength=*/ 1)(name) && /^[a-zA-Z0-9-._]+$/.test(name); // Only allow alphanumeric characters, dashes, periods, or underscores }; Adapter.prototype.getStringValidator = function (maxLength, minLength) { if (maxLength === void 0) { maxLength = 1000; } if (minLength === void 0) { minLength = 0; } return function isValidString(value) { if (typeof value !== 'string') { return false; } if (maxLength > 0 && value.length > maxLength) { return false; } return value.length >= minLength; }; }; Adapter.prototype.getCodePushError = function (message, errorCode) { return { message: message, statusCode: errorCode }; }; return Adapter; }()); module.exports = Adapter;