UNPKG

3.13 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3const APP_DIR = 'app';
4const LEGACY_APP_DIR = 'marketplace_builder';
5const MODULES_DIR = 'modules';
6const program = require('commander'),
7 fs = require('fs'),
8 shell = require('shelljs'),
9 glob = require('glob'),
10 prepareArchive = require('./lib/prepareArchive'),
11 templates = require('./lib/templates'),
12 logger = require('./lib/logger'),
13 settings = require('./lib/settings'),
14 version = require('./package.json').version;
15
16const ALLOWED_DIRECTORIES = [APP_DIR, LEGACY_APP_DIR, MODULES_DIR];
17const availableDirectories = () => ALLOWED_DIRECTORIES.filter(fs.existsSync);
18const isEmpty = dir => shell.ls(dir).length == 0;
19
20const addModulesToArchive = archive => {
21 if (!fs.existsSync(MODULES_DIR)) return Promise.resolve(true);
22
23 return Promise.all(
24 glob.sync('*/', { cwd: MODULES_DIR }).map(
25 module => ( addModuleToArchive(module, archive))
26 )
27 );
28};
29
30const addModuleToArchive = (module, archive, pattern = '?(public|private)/**') => {
31 return new Promise((resolve, reject) => {
32 glob(pattern, { cwd: `${MODULES_DIR}/${module}` }, (err, files) => {
33 if (err) throw reject(err);
34 const moduleTemplateData = templateData(module);
35
36 return Promise.all(
37 files.map(f => {
38 const path = `${MODULES_DIR}/${module}/${f}`;
39 return new Promise((resolve, reject) => {
40 fs.lstat(path, (err, stat) => {
41 if (!stat.isDirectory()) {
42 archive.append(templates.fillInTemplateValues(path, moduleTemplateData), {
43 name: path
44 });
45 }
46 resolve();
47 });
48 });
49 })
50 ).then(r => {
51 resolve();
52 });
53 });
54 });
55};
56
57const makeArchive = (path, directory, withoutAssets) => {
58 if (availableDirectories().length === 0) {
59 logger.Error(`At least one of ${ALLOWED_DIRECTORIES} directories is needed to deploy`, { hideTimestamp: true });
60 }
61
62 availableDirectories().map(dir => {
63 if (isEmpty(dir) && !withoutAssets) {
64 logger.Error(`${dir} can't be empty if the deploy is not partial - it would remove all the files from the instance`,
65 { hideTimestamp: true });
66 }
67 });
68
69 const releaseArchive = prepareArchive(path);
70 let options = { cwd: directory };
71 if (withoutAssets) options.ignore = ['assets/**'];
72 releaseArchive.glob('**/*', options, { prefix: directory });
73
74 addModulesToArchive(releaseArchive).then(r => {
75 releaseArchive.finalize();
76 });
77};
78
79const templateData = (module) => {
80 return settings.loadSettingsFileForModule(module);
81};
82
83program
84 .version(version)
85 .option('--without-assets', 'if present assets directory will be excluded')
86 .option('--target <target>', 'path to archive', process.env.TARGET || './tmp/marketplace-release.zip')
87 .parse(process.argv);
88
89let app_directory;
90if (fs.existsSync(APP_DIR)) {
91 app_directory = APP_DIR;
92} else {
93 console.log(`Falling back to legacy app-directory name. Please consider renaming ${LEGACY_APP_DIR} to ${APP_DIR}`);
94 app_directory = LEGACY_APP_DIR;
95}
96
97makeArchive(program.target, app_directory, program.withoutAssets);