Verified Commit 316bc7b2 authored by FabioWidmer's avatar FabioWidmer
Browse files

Improve formatting

parent 6b046fef
<template> <template>
<f7-app :params="f7params"> <f7-app :params="f7params">
<f7-views class="safe-areas"> <f7-views class="safe-areas">
<f7-view main url="/" :push-state="pushState" :stack-pages="true" :routes="routes"></f7-view> <f7-view :push-state="pushState" :routes="routes" :stack-pages="true" main url="/"></f7-view>
</f7-views> </f7-views>
</f7-app> </f7-app>
</template> </template>
<script> <script>
import { Device } from 'framework7/framework7-lite.esm.bundle.js'; import {Device} from 'framework7/framework7-lite.esm.bundle.js';
import cordovaApp from '../js/cordova-app.js'; import cordovaApp from '../js/cordova-app.js';
import routes from '../js/routes.js'; import routes from '../js/routes.js';
export default { export default {
data() { data() {
return { return {
pushState: !Device.cordova, pushState: !Device.cordova,
routes, routes,
f7params: { f7params: {
id: 'com.ablota.store', id: 'com.ablota.store',
name: 'Ablota Store', name: 'Ablota Store',
version: '1.0.1', version: '1.0.1',
theme: 'auto', theme: 'auto',
data: function() { data: function() {
return { return {
url: 'https://store.ablota.com/', url: 'https://store.ablota.com/',
server: { server: {
url: 'https://api.store.ablota.com/' url: 'https://api.store.ablota.com/',
}, },
deviceInfo: null, deviceInfo: null,
}; };
},
autoDarkTheme: true,
serviceWorker: Device.cordova ? {} : {
path: '/service-worker.js',
},
input: {
scrollIntoViewOnFocus: Device.cordova && !Device.electron,
scrollIntoViewCentered: Device.cordova && !Device.electron,
},
statusbar: {
enabled: false,
},
toast: {
closeButton: true,
closeButtonText: this.$t('words.ok'),
closeTimeout: 5000,
destroyonClose: true,
},
dialog: {
buttonOk: this.$t('words.ok'),
buttonCancel: this.$t('words.cancel'),
},
photoBrowser: {
routableModals: false,
type: 'popup',
pageBackLinkText: this.$t('words.back'),
popupCloseLinkText: this.$t('words.ok'),
navbarOfText: this.$t('words.of'),
},
lazy: {
sequential: false,
},
touch: {
tapHold: true,
},
}, },
}; autoDarkTheme: true,
}, serviceWorker: Device.cordova ? {} : {
path: '/service-worker.js',
},
input: {
scrollIntoViewOnFocus: Device.cordova && !Device.electron,
scrollIntoViewCentered: Device.cordova && !Device.electron,
},
statusbar: {
enabled: false,
},
toast: {
closeButton: true,
closeButtonText: this.$t('words.ok'),
closeTimeout: 5000,
destroyonClose: true,
},
dialog: {
buttonOk: this.$t('words.ok'),
buttonCancel: this.$t('words.cancel'),
},
photoBrowser: {
routableModals: false,
type: 'popup',
pageBackLinkText: this.$t('words.back'),
popupCloseLinkText: this.$t('words.ok'),
navbarOfText: this.$t('words.of'),
},
lazy: {
sequential: false,
},
touch: {
tapHold: true,
},
},
};
},
mounted() { mounted() {
this.$f7ready((f7) => { this.$f7ready((f7) => {
if(Device.cordova) { if(Device.cordova) {
cordovaApp.init(f7); cordovaApp.init(f7);
} }
this.$store.dispatch('load', { this.$store.dispatch('load', {
server: this.$f7.data.server, server: this.$f7.data.server,
sourceAge: this.$store.state.settings.sourceAge, sourceAge: this.$store.state.settings.sourceAge,
warningCallback: (error, payload = {}) => this.$f7.dialog.alert(this.$t(error, payload)), warningCallback: (error, payload = {}) => this.$f7.dialog.alert(this.$t(error, payload)),
});
}); });
}, });
}; },
};
</script> </script>
<template> <template>
<div class="popover-antifeatures"> <div class="popover-antifeatures">
<f7-popover :class="`popover-antifeatures-${key}`" v-for="(antiFeature, key) in $t('lists.antiFeatures')" :key="key"> <f7-popover v-for="(antiFeature, key) in $t('lists.antiFeatures')" :key="key" :class="`popover-antifeatures-${key}`">
<f7-block><p>{{ antiFeature.description }}</p></f7-block> <f7-block><p>{{ antiFeature.description }}</p></f7-block>
<f7-list> <f7-list>
<f7-list-item :footer="antiFeature.key" :link="`https://f-droid.org/docs/Anti-Features/#${key}`" :title="$t('words.more')" external popover-close target="_system"> <f7-list-item :footer="antiFeature.key" :link="`https://f-droid.org/docs/Anti-Features/#${key}`" :title="$t('words.more')" external popover-close target="_system">
<f7-icon aurora="f7:link" ios="f7:link" md="material:link" slot="media"></f7-icon> <f7-icon slot="media" aurora="f7:link" ios="f7:link" md="material:link"></f7-icon>
</f7-list-item> </f7-list-item>
</f7-list> </f7-list>
</f7-popover> </f7-popover>
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<div class="timeline-item-inner"> <div class="timeline-item-inner">
<div class="timeline-item-title">{{ $t('words.download') }}</div> <div class="timeline-item-title">{{ $t('words.download') }}</div>
<div class="timeline-item-text">{{ $t('popups.downloadApp.steps.download.description') }}</div> <div class="timeline-item-text">{{ $t('popups.downloadApp.steps.download.description') }}</div>
<f7-button href="https://ablota.com/repo/Ablota_Store.apk" :text="$t('words.download')" fill raised external></f7-button> <f7-button :text="$t('words.download')" external fill href="https://ablota.com/repo/Ablota_Store.apk" raised></f7-button>
</div> </div>
</div> </div>
</div> </div>
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<div class="timeline-item-inner"> <div class="timeline-item-inner">
<div class="timeline-item-title">{{ $t('words.done') }}</div> <div class="timeline-item-title">{{ $t('words.done') }}</div>
<div class="timeline-item-text">{{ $t('popups.downloadApp.steps.done.description') }}</div> <div class="timeline-item-text">{{ $t('popups.downloadApp.steps.done.description') }}</div>
<f7-button href="https://store.ablota.com" :text="$t('words.launch')" fill raised external></f7-button> <f7-button :text="$t('words.launch')" external fill href="https://store.ablota.com" raised></f7-button>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -2,8 +2,9 @@ $icon-sizes: 20, 30, 40, 50, 60; ...@@ -2,8 +2,9 @@ $icon-sizes: 20, 30, 40, 50, 60;
/* iOS Cordova Tweak */ /* iOS Cordova Tweak */
.device-cordova.device-ios { .device-cordova.device-ios {
height: 100vh; height: 100vh;
} }
/* Your app custom styles here */ /* Your app custom styles here */
body { body {
...@@ -80,6 +81,7 @@ body { ...@@ -80,6 +81,7 @@ body {
.item-inner { .item-inner {
padding: 0; padding: 0;
} }
.item-subtitle p { .item-subtitle p {
margin-top: 0; margin-top: 0;
} }
......
/* Material Icons Font (for MD theme) */ /* Material Icons Font (for MD theme) */
@font-face { @font-face {
font-family: 'Material Icons'; font-family: 'Material Icons';
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
src: url(../fonts/MaterialIcons-Regular.eot); src: url(../fonts/MaterialIcons-Regular.eot);
src: local('Material Icons'), src: local('Material Icons'),
local('MaterialIcons-Regular'), local('MaterialIcons-Regular'),
url(../fonts/MaterialIcons-Regular.woff2) format('woff2'), url(../fonts/MaterialIcons-Regular.woff2) format('woff2'),
url(../fonts/MaterialIcons-Regular.woff) format('woff'), url(../fonts/MaterialIcons-Regular.woff) format('woff'),
url(../fonts/MaterialIcons-Regular.ttf) format('truetype'); url(../fonts/MaterialIcons-Regular.ttf) format('truetype');
} }
.material-icons { .material-icons {
font-family: 'Material Icons'; font-family: 'Material Icons';
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
font-size: 24px; font-size: 24px;
display: inline-block; display: inline-block;
line-height: 1; line-height: 1;
text-transform: none; text-transform: none;
letter-spacing: normal; letter-spacing: normal;
word-wrap: normal; word-wrap: normal;
white-space: nowrap; white-space: nowrap;
direction: ltr; direction: ltr;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
font-feature-settings: 'liga'; font-feature-settings: 'liga';
} }
/* Framework7 Icons Font (for iOS theme) */ /* Framework7 Icons Font (for iOS theme) */
@font-face { @font-face {
font-family: 'Framework7 Icons'; font-family: 'Framework7 Icons';
font-style: normal; font-style: normal;
font-weight: 400; font-weight: 400;
src: url("../fonts/Framework7Icons-Regular.eot"); src: url("../fonts/Framework7Icons-Regular.eot");
src: url("../fonts/Framework7Icons-Regular.woff2") format("woff2"), src: url("../fonts/Framework7Icons-Regular.woff2") format("woff2"),
url("../fonts/Framework7Icons-Regular.woff") format("woff"), url("../fonts/Framework7Icons-Regular.woff") format("woff"),
url("../fonts/Framework7Icons-Regular.ttf") format("truetype"); url("../fonts/Framework7Icons-Regular.ttf") format("truetype");
} }
.f7-icons { .f7-icons {
font-family: 'Framework7 Icons'; font-family: 'Framework7 Icons';
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
font-size: 28px; font-size: 28px;
line-height: 1; line-height: 1;
letter-spacing: normal; letter-spacing: normal;
text-transform: none; text-transform: none;
display: inline-block; display: inline-block;
white-space: nowrap; white-space: nowrap;
word-wrap: normal; word-wrap: normal;
direction: ltr; direction: ltr;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
-webkit-font-feature-settings: "liga"; -webkit-font-feature-settings: "liga";
-moz-font-feature-settings: "liga=1"; -moz-font-feature-settings: "liga=1";
-moz-font-feature-settings: "liga"; -moz-font-feature-settings: "liga";
font-feature-settings: "liga"; font-feature-settings: "liga";
text-align: center; text-align: center;
} }
...@@ -9,4 +9,4 @@ export default { ...@@ -9,4 +9,4 @@ export default {
], ],
}, },
}, },
} };
...@@ -343,7 +343,7 @@ export default { ...@@ -343,7 +343,7 @@ export default {
}, },
done: { done: {
description: '@:app.name is ready! You can now launch @:app.name and start downloading apps.', description: '@:app.name is ready! You can now launch @:app.name and start downloading apps.',
} },
}, },
}, },
}, },
......
...@@ -3,43 +3,45 @@ ...@@ -3,43 +3,45 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<% if (process.env.NODE_ENV === 'production') { %> <% if (process.env.NODE_ENV === 'production') { %>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content: https://api.store.ablota.com"> <meta content="default-src 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content: https://api.store.ablota.com" http-equiv="Content-Security-Policy">
<% } %> <% } %>
<meta http-equiv="x-ua-compatible" content="ie=edge"> <meta content="ie=edge" http-equiv="x-ua-compatible">
<meta property="og:image:width" content="128"> <meta content="128" property="og:image:width">
<meta property="og:image:height" content="128"> <meta content="128" property="og:image:height">
<meta property="og:description" content="The universal, decentralized and open source app store."> <meta content="The universal, decentralized and open source app store." property="og:description">
<meta property="og:title" content="Ablota Store"> <meta content="Ablota Store" property="og:title">
<meta property="og:url" content="https://store.ablota.com"> <meta content="https://store.ablota.com" property="og:url">
<meta property="og:image" content="https://store.ablota.com/static/icons/favicon.png"> <meta content="https://store.ablota.com/static/icons/favicon.png" property="og:image">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui, viewport-fit=cover"> <meta content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui, viewport-fit=cover" name="viewport">
<meta name="robots" content="noarchive, notranslate, noimageindex"> <meta content="noarchive, notranslate, noimageindex" name="robots">
<meta name="theme-color" content="#007aff"> <meta content="#007aff" name="theme-color">
<meta name="format-detection" content="telephone=no"> <meta content="telephone=no" name="format-detection">
<meta name="format-detection" content="date=no"> <meta content="date=no" name="format-detection">
<meta name="format-detection" content="address=no"> <meta content="address=no" name="format-detection">
<meta name="msapplication-TileColor" content="#007aff"> <meta content="#007aff" name="msapplication-TileColor">
<meta name="msapplication-tap-highlight" content="no"> <meta content="no" name="msapplication-tap-highlight">
<meta name="author" content="Ablota (StarApps GmbH)"> <meta content="Ablota (StarApps GmbH)" name="author">
<meta name="description" content="The universal, decentralized and open source app store."> <meta content="The universal, decentralized and open source app store." name="description">
<meta name="keywords" content="ablota store, ablota, store, app, apps, game, game, app store, universal, open source, decentralized, foss, floss, android, ios, web, electron, desktop, starapps, starapps ltd, starapps gmbh"> <meta
content="ablota store, ablota, store, app, apps, game, game, app store, universal, open source, decentralized, foss, floss, android, ios, web, electron, desktop, starapps, starapps ltd, starapps gmbh"
name="keywords"
>
<title>Ablota Store</title> <title>Ablota Store</title>
<% if (process.env.TARGET === 'web') { %> <% if (process.env.TARGET === 'web') { %>
<meta name="apple-mobile-web-app-capable" content="yes"> <meta content="yes" name="apple-mobile-web-app-capable">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta content="black-translucent" name="apple-mobile-web-app-status-bar-style">
<% for (var index in htmlWebpackPlugin.files.css) { %> <% for (var index in htmlWebpackPlugin.files.css) { %>
<link rel="preload" href="<%= htmlWebpackPlugin.files.css[index] %>" as="style"> <link as="style" href="<%= htmlWebpackPlugin.files.css[index] %>" rel="preload">
<% } %> <% } %> <% for (var index in htmlWebpackPlugin.files.js) { %>
<% for (var index in htmlWebpackPlugin.files.js) { %> <link as="script" href="<%= htmlWebpackPlugin.files.js[index] %>" rel="preload">
<link rel="preload" href="<%= htmlWebpackPlugin.files.js[index] %>" as="script">
<% } %> <% } %>
<link rel="apple-touch-icon" sizes="256x256" href="/static/icons/apple-touch-icon.png"> <link href="/static/icons/apple-touch-icon.png" rel="apple-touch-icon" sizes="256x256">
<link rel="icon" type="image/png" sizes="128x128" href="/static/icons/favicon.png"> <link href="/static/icons/favicon.png" rel="icon" sizes="128x128" type="image/png">
<link rel="manifest" href="/manifest.json"> <link href="/manifest.json" rel="manifest">
<% } %> <% } %>
</head> </head>
<body> <body>
......
import { Request, Device } from 'framework7'; import {Device, Request} from 'framework7';
import sanitizeHtml from 'sanitize-html'; import sanitizeHtml from 'sanitize-html';
import sourceValidator from '../validators/source'; import sourceValidator from '../validators/source';
...@@ -38,7 +38,13 @@ export function fetchSource(url, server, age = 6) { ...@@ -38,7 +38,13 @@ export function fetchSource(url, server, age = 6) {
} }
}); });
['phoneScreenshots', 'sevenInchScreenshots', 'tenInchScreenshots', 'tvScreenshots', 'wearScreenshots'].forEach(assets => app.localized[key][assets].forEach((asset, index) => { [
'phoneScreenshots',
'sevenInchScreenshots',
'tenInchScreenshots',
'tvScreenshots',
'wearScreenshots',
].forEach(assets => app.localized[key][assets].forEach((asset, index) => {
app.localized[key][assets][index] = `${url}${app.packageName}/${key}/${assets}/${asset}`; app.localized[key][assets][index] = `${url}${app.packageName}/${key}/${assets}/${asset}`;
})); }));
}); });
...@@ -60,8 +66,8 @@ export function fetchSource(url, server, age = 6) { ...@@ -60,8 +66,8 @@ export function fetchSource(url, server, age = 6) {
}; };
if(Device.cordova) { if(Device.cordova) {
window.resolveLocalFileSystemURL(cordova.file.dataDirectory, dataDirectory => { window.resolveLocalFileSystemURL(cordova.file.dataDirectory, dataDirectory => {
dataDirectory.getDirectory('sources', { create: true, exclusive: false }, dataSourcesDirectory => { dataDirectory.getDirectory('sources', {create: true, exclusive: false}, dataSourcesDirectory => {
ablota.store.file.hashName(url, data => { ablota.store.file.hashName(url, data => {
const fetchIndex = () => { const fetchIndex = () => {
ablota.store.file.download(`${url}index-v1.jar`, `${cordova.file.dataDirectory}sources/${data.hash}.jar`, {}, {}, data => { ablota.store.file.download(`${url}index-v1.jar`, `${cordova.file.dataDirectory}sources/${data.hash}.jar`, {}, {}, data => {
...@@ -79,7 +85,7 @@ export function fetchSource(url, server, age = 6) { ...@@ -79,7 +85,7 @@ export function fetchSource(url, server, age = 6) {
}, () => reject('request')); }, () => reject('request'));
}; };
dataSourcesDirectory.getFile(`${data.hash}.jar`, { create: false }, sourceFile => { dataSourcesDirectory.getFile(`${data.hash}.jar`, {create: false}, sourceFile => {
sourceFile.file(file => { sourceFile.file(file => {
if(file.lastModified < new Date().getTime() - age * 60 * 60 * 1000) { if(file.lastModified < new Date().getTime() - age * 60 * 60 * 1000) {
fetchIndex(); fetchIndex();
...@@ -130,8 +136,8 @@ export function fetchAsset(url, server, age = 24) { ...@@ -130,8 +136,8 @@ export function fetchAsset(url, server, age = 24) {
}; };
window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, cacheDirectory => { window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, cacheDirectory => {
cacheDirectory.getDirectory('assets', { create: true, exclusive: false }, cacheAssetsDirectory => { cacheDirectory.getDirectory('assets', {create: true, exclusive: false}, cacheAssetsDirectory => {
cacheAssetsDirectory.getFile(data.hash, { create: false }, assetFile => { cacheAssetsDirectory.getFile(data.hash, {create: false}, assetFile => {
assetFile.file(file => { assetFile.file(file => {
if(file.lastModified < new Date().getTime() - age * 60 * 60 * 1000) { if(file.lastModified < new Date().getTime() - age * 60 * 60 * 1000) {
downloadAsset(); downloadAsset();
...@@ -154,7 +160,7 @@ export function fetchAsset(url, server, age = 24) { ...@@ -154,7 +160,7 @@ export function fetchAsset(url, server, age = 24) {
} else { } else {
resolve({ resolve({
originalUrl: url, originalUrl: url,
localUrl: `${server.url}v1/proxy/asset?url=${url}` localUrl: `${server.url}v1/proxy/asset?url=${url}`,
}); });
} }
}); });
...@@ -323,7 +329,7 @@ export function downloadPackage(app, appPackage, updateCallback) { ...@@ -323,7 +329,7 @@ export function downloadPackage(app, appPackage, updateCallback) {
}; };
window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, cacheDirectory => { window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, cacheDirectory => {
cacheDirectory.getDirectory('packages', { create: true, exclusive: false }, packagesDirectory => { cacheDirectory.getDirectory('packages', {create: true, exclusive: false}, packagesDirectory => {
ablota.store.file.download(appPackage.apkName, packageFilePath, {}, {}, data => { ablota.store.file.download(appPackage.apkName, packageFilePath, {}, {}, data => {
if(data.status === 'success') { if(data.status === 'success') {
ablota.store.file.hash(packageFilePath, data => { ablota.store.file.hash(packageFilePath, data => {
...@@ -331,7 +337,7 @@ export function downloadPackage(app, appPackage, updateCallback) { ...@@ -331,7 +337,7 @@ export function downloadPackage(app, appPackage, updateCallback) {
if(data.hash.toLowerCase() === appPackage.hash) { if(data.hash.toLowerCase() === appPackage.hash) {
finish('package'); finish('package');
} else { } else {
packagesDirectory.getFile(packageFilePath, { create: false }, packageFileEntry => { packagesDirectory.getFile(packageFilePath, {create: false}, packageFileEntry => {
packageFileEntry.remove(); packageFileEntry.remove();
}); });
...@@ -360,9 +366,9 @@ export function downloadPackage(app, appPackage, updateCallback) { ...@@ -360,9 +366,9 @@ export function downloadPackage(app, appPackage, updateCallback) {
if(appPackage[obbFile] && appPackage[`${obbFile}Sha256`]) { if(appPackage[obbFile] && appPackage[`${obbFile}Sha256`]) {
window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, externalRootDirectory => { window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, externalRootDirectory => {
externalRootDirectory.getDirectory('Android', { create: true, exclusive: false }, androidDirectory => { externalRootDirectory.getDirectory('Android', {create: true, exclusive: false}, androidDirectory => {
androidDirectory.getDirectory('obb', { create: true, exclusive: false }, obbDirectory => { androidDirectory.getDirectory('obb', {create: true, exclusive: false}, obbDirectory => {
obbDirectory.getDirectory(appPackage.packageName, { create: true, exclusive: false }, appPackageDirectory => { obbDirectory.getDirectory(appPackage.packageName, {create: true, exclusive: false}, appPackageDirectory => {
const obbFilename = appPackage[obbFile].substring(appPackage[obbFile].lastIndexOf('/') + 1); const obbFilename = appPackage[obbFile].substring(appPackage[obbFile].lastIndexOf('/') + 1);
const obbFilePath = `${cordova.file.externalCacheDirectory}/${obbFilename}`; const obbFilePath = `${cordova.file.externalCacheDirectory}/${obbFilename}`;
const downloadObbFile = () => { const downloadObbFile = () => {
...@@ -374,14 +380,14 @@ export function downloadPackage(app, appPackage, updateCallback) { ...@@ -374,14 +380,14 @@ export function downloadPackage(app, appPackage, updateCallback) {
if(data.status === 'success') { if(data.status === 'success') {
if(data.hash.toLowerCase() === appPackage[`${obbFile}Sha256`]) { if(data.hash.toLowerCase() === appPackage[`${obbFile}Sha256`]) {
window.resolveLocalFileSystemURL(cordova.file.externalCacheDirectory, externalCacheDirectory => { window.resolveLocalFileSystemURL(cordova.file.externalCacheDirectory, externalCacheDirectory => {
externalCacheDirectory.getFile(obbFilename, { create: false }, obbFileEntry => { externalCacheDirectory.getFile(obbFilename, {create: false}, obbFileEntry => {
obbFileEntry.moveTo(appPackageDirectory, obbFilename, () => { obbFileEntry.moveTo(appPackageDirectory, obbFilename, () => {
finish(obbName); finish(obbName);
}, () => reject('utils.downloadPackage.directory')); }, () => reject('utils.downloadPackage.directory'));
}, () => reject('utils.downloadPackage.directory')); }, () => reject('