@interaktiv/mibuilder-core
Version:
Core libraries to interact with MiBuilder projects.
181 lines (145 loc) • 6.07 kB
JavaScript
;
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;
}
}