UNPKG

@interaktiv/mibuilder-core

Version:

Core libraries to interact with MiBuilder projects.

181 lines (145 loc) 6.07 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getAppVersions = getAppVersions; exports.downloadMetadata = downloadMetadata; exports.processSupplyTemplates = processSupplyTemplates; exports.initMetadata = initMetadata; exports.CHANGELOGS_FOLDER_NAME = exports.IMAGES_FOLDER_NAME = exports.SCREENSHOT_TYPES = exports.IMAGES_TYPES = exports.AVAILABLE_METADATA_FIELDS = void 0; var _path = _interopRequireDefault(require("path")); var _dxl = require("@interaktiv/dxl"); var _travelingFastlane = require("@interaktiv/traveling-fastlane"); var _types = require("@interaktiv/types"); var _mibuilderError = require("../mibuilder-error"); var _ux = require("../ux"); const APP_NOT_FOUND_REGEXP = /(applicationNotFound|No application was found)/gim; const NO_CHANGELOGS_TO_DOWNLOAD_REGEXP = /Nothing to download/gim; let cliUx; async function getCliUx() { if (cliUx == null) cliUx = await _ux.UX.create('deliver'); return cliUx; } // Values taken from fastlane.tools source see // https://github.com/fastlane/fastlane/blob/1af33c0884/supply/lib/supply.rb const AVAILABLE_METADATA_FIELDS = ['title', 'short_description', 'full_description', 'video']; exports.AVAILABLE_METADATA_FIELDS = AVAILABLE_METADATA_FIELDS; const IMAGES_TYPES = ['featureGraphic', 'icon', 'promoGraphic', 'tvBanner']; exports.IMAGES_TYPES = IMAGES_TYPES; const SCREENSHOT_TYPES = ['phoneScreenshots', 'sevenInchScreenshots', 'tenInchScreenshots', 'tvScreenshots', 'wearScreenshots']; exports.SCREENSHOT_TYPES = SCREENSHOT_TYPES; const IMAGES_FOLDER_NAME = 'images'; exports.IMAGES_FOLDER_NAME = IMAGES_FOLDER_NAME; const CHANGELOGS_FOLDER_NAME = 'changelogs'; exports.CHANGELOGS_FOLDER_NAME = CHANGELOGS_FOLDER_NAME; async function getAppVersions({ packageName, googlePlayJsonKeyPath, track = 'production' }) { const result = await (0, _travelingFastlane.runAction)(_travelingFastlane.travelingFastlane.getAndroidAppVersionCodes, [packageName, googlePlayJsonKeyPath, track], { pipeStdout: true }); return result; } // eslint-disable-next-line complexity async function downloadMetadata({ config = {}, paths = {}, force = false, confirmForce = false }) { const { rootDir } = config; if ((await (0, _dxl.exists)(rootDir)) === false) { throw new _mibuilderError.MiBuilderError(`Kein gültiges Project in ${rootDir} gefunden`, 'InvalidProjectWorkspace', ['App Projekt erstellen über: $ mibuilder create:app']); } const { fastlaneMetaDataDirAndroid: projectMetaDataDirAndroid } = paths; const supplyAlreadyInitialized = await (0, _dxl.exists)(_path.default.resolve(projectMetaDataDirAndroid)); if (supplyAlreadyInitialized && force === true === false) { throw new _mibuilderError.MiBuilderError('Metadaten bereits heruntergeladen', 'StoreMetadataExists', ['Set force param to true']); } if (supplyAlreadyInitialized && confirmForce) { const cli = await getCliUx(); try { const yesno = await cli.confirm(`Bestehende Metadata überschreiben?`); if (yesno === false) { throw new _mibuilderError.MiBuilderError('Metadaten Aktualisierung abgebrochen', 'MetadataDownloadAbort'); } cliUx.log(''); cliUx.startSpinner('Aktualisiere Metadaten, überschreibe vorhandene'); } catch (err) { // Ignore timeout error otherwise re-throw if (/prompt timeout/gim.test(err.toString()) === false) throw err; cliUx.log(''); cliUx.startSpinner('Aktualisiere Metadaten, überschreibe vorhandene'); } } await (0, _dxl.remove)(projectMetaDataDirAndroid); let appNotFound = false; try { await (0, _travelingFastlane.runBundleAction)('supply', ['init', '--json_key', (0, _types.get)(config, 'android.googlePlayJsonKeyPath'), '--package_name', config.app.packageName], { cwd: rootDir, pipeStdout: true }); } catch (err) { const { message: errorMessage } = err; appNotFound = APP_NOT_FOUND_REGEXP.test(errorMessage); const noChangelogsFound = NO_CHANGELOGS_TO_DOWNLOAD_REGEXP.test(err.message); const reThrow = appNotFound === false && noChangelogsFound === false; if (reThrow) throw err; } if (appNotFound) await processSupplyTemplates({ config, paths }); if (supplyAlreadyInitialized && confirmForce) cliUx.stopSpinner(); } async function processSupplyTemplates({ config = {}, locale = 'de-DE', paths = {} }) { const { fastlaneMetaDataDirAndroid } = paths; // Meta data const localizedMetaDataDir = _path.default.join(fastlaneMetaDataDirAndroid, locale); await Promise.all(AVAILABLE_METADATA_FIELDS.map(name => { let content = ''; if (name === 'title') { content = config.app.name; } return { name, path: _path.default.join(localizedMetaDataDir, `${name}.txt`), content }; }).map(f => (0, _dxl.outputFile)(f.path, f.content))); // Images const screenshotsDir = _path.default.join(localizedMetaDataDir, IMAGES_FOLDER_NAME); // Images dirs await Promise.all(SCREENSHOT_TYPES.map(type => _path.default.join(screenshotsDir, type)).map(dir => (0, _dxl.mkdirp)(dir))); // Images placeholders await Promise.all(IMAGES_TYPES.map(type => _path.default.join(screenshotsDir, `${type}.example`)).map(p => (0, _dxl.outputFile)(p, ''))); // Changelogs const changelogsDir = _path.default.join(localizedMetaDataDir, CHANGELOGS_FOLDER_NAME); await (0, _dxl.mkdirp)(changelogsDir); const versionCode = parseInt((0, _types.get)(config, 'android.versionCode', 0), 10); await (0, _dxl.outputFile)(_path.default.join(changelogsDir, `${versionCode + 1}.txt`), 'Fehlerkorrekturen und Leistungsverbesserungen'); } async function initMetadata({ config = {}, paths = {}, force = false }) { try { await downloadMetadata({ config, paths, force }); } catch (err) { if (err.name !== 'StoreMetadataExists' && APP_NOT_FOUND_REGEXP.test(err.message) === false) throw err; } }