1 | #!/usr/bin/env node
|
2 |
|
3 | const APP_DIR = 'app';
|
4 | const LEGACY_APP_DIR = 'marketplace_builder';
|
5 | const MODULES_DIR = 'modules';
|
6 | const 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 |
|
16 | const ALLOWED_DIRECTORIES = [APP_DIR, LEGACY_APP_DIR, MODULES_DIR];
|
17 | const availableDirectories = () => ALLOWED_DIRECTORIES.filter(fs.existsSync);
|
18 | const isEmpty = dir => shell.ls(dir).length == 0;
|
19 |
|
20 | const 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 |
|
30 | const 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 |
|
57 | const 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 |
|
79 | const templateData = (module) => {
|
80 | return settings.loadSettingsFileForModule(module);
|
81 | };
|
82 |
|
83 | program
|
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 |
|
89 | let app_directory;
|
90 | if (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 |
|
97 | makeArchive(program.target, app_directory, program.withoutAssets);
|