UNPKG

2.77 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3'use strict';
4
5const { resolve } = require('path');
6
7const program = require('commander');
8
9const {
10 asyncForEach,
11 asyncForIn,
12 copy,
13 getServiceSpecs,
14 hasDuxisManifest,
15 readDir,
16 readDuxisManifest,
17 rmrf
18} = require('./utils');
19
20// -- Constants --------------- --- -- -
21
22const PROD_COMPOSE_FILE = 'dc.prod.yml';
23const COMPOSE_FILE = process.env.COMPOSE_FILE || PROD_COMPOSE_FILE;
24
25// -- copyProjectSetup --------------- --- -- -
26
27/**
28 * Copies the project setup directory in each front image build context, such that it can be
29 * included in the image at build-time and be available when packing the frontend content.
30 *
31 * @param {string} [composeFile] - The name of the Compose file to use. Defaults to the value of the
32 * `COMPOSE_FILE` environment variable, or `dc.prod.yml`.
33 *
34 * @returns {Promise.<string[]>}
35 */
36async function copyProjectSetup({ args: serviceNames, clean, composefile }) {
37 const services = await getServiceSpecs(resolve(composefile));
38 if (clean) {
39 await asyncForIn(services, async (serviceSpec) => {
40 if (serviceSpec.build && serviceSpec.build.context) {
41 await rmrf(resolve(serviceSpec.build.context, '__project_setup__')); //.catch(() => null);
42 }
43 });
44 }
45 else if (serviceNames.length > 0) {
46 await asyncForIn(serviceNames, async (serviceName) => {
47 const serviceSpec = services[serviceName];
48 if (serviceSpec) {
49 await copySetup(serviceSpec);
50 }
51 else {
52 throw new Error(`There is no '${serviceName}' service.`);
53 }
54 });
55 }
56 else {
57 await asyncForIn(services, async (serviceSpec) => {
58 await copySetup(serviceSpec);
59 });
60 }
61}
62
63const copySetup = async (serviceSpec) => {
64 if (serviceSpec.build && serviceSpec.build.context) {
65 if (await hasDuxisManifest(serviceSpec.build.context)) {
66 const manifest = await readDuxisManifest(serviceSpec.build.context);
67 if (manifest.cargoApp || manifest.cargoFrontend) {
68 const targetPath = resolve(serviceSpec.build.context, '__project_setup__');
69 await asyncForEach(await readDir('setup'), async (fileName) => {
70 if (!fileName.includes('local')) {
71 await copy(resolve('setup', fileName), resolve(targetPath, fileName), {
72 preserveTimestamps: true
73 }); //.catch(() => null);
74 }
75 });
76 }
77 }
78 }
79};
80
81// -- CLI --------------- --- -- -
82
83program
84 .version('0.1.0')
85 .usage('[options] <service ...>')
86 .option('--clean', `Remove the temporary copies.`)
87 .option('--composefile [path]', `Specify the Compose file to use [default: ${COMPOSE_FILE}].`, COMPOSE_FILE)
88 .parse(process.argv);
89
90copyProjectSetup(program)
91 .catch((error) => {
92 console.error(error);
93 process.exit(1);
94 });