@scandipwa/magento-scripts 2.0.0-alpha.2 → 2.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/exec.js +71 -0
  2. package/index.js +1 -1
  3. package/lib/commands/cli.js +18 -1
  4. package/lib/commands/execute.js +2 -57
  5. package/lib/commands/logs.js +28 -2
  6. package/lib/commands/start.js +24 -3
  7. package/lib/commands/status.js +9 -1
  8. package/lib/config/config.js +20 -2
  9. package/lib/config/docker.js +90 -53
  10. package/lib/config/get-project-configuration.js +5 -0
  11. package/lib/config/index.js +10 -3
  12. package/lib/config/php/versions/php-7.2.js +1 -0
  13. package/lib/config/php/versions/php-7.3.js +1 -0
  14. package/lib/config/php/versions/php-7.4.js +1 -0
  15. package/lib/config/php/versions/php-8.1.js +1 -0
  16. package/lib/config/php-config.js +4 -3
  17. package/lib/config/port-config.js +3 -1
  18. package/lib/config/services/composer/versions/composer-1.js +13 -0
  19. package/lib/config/services/composer/versions/composer-2.js +8 -0
  20. package/lib/config/services/composer/versions/index.js +4 -0
  21. package/lib/config/services/maildev/index.js +7 -0
  22. package/lib/config/services/nginx/versions/index.js +3 -0
  23. package/lib/config/services/nginx/versions/nginx-1.18.js +11 -0
  24. package/lib/config/{ssl-terminator → services/ssl-terminator}/index.js +3 -0
  25. package/lib/config/templates/magentorc.template +12 -5
  26. package/lib/config/templates/php-debug.template.ini +31 -0
  27. package/lib/config/templates/php-fpm.template.conf +1 -2
  28. package/lib/config/templates/php.template.ini +5 -201
  29. package/lib/config/templates/ssl-terminator.template.conf +10 -3
  30. package/lib/config/templates/varnish.template.vcl +20 -13
  31. package/lib/config/varnish/varnish-6-0.js +4 -0
  32. package/lib/config/varnish/varnish-6-6.js +4 -0
  33. package/lib/config/varnish/varnish-7-0.js +4 -0
  34. package/lib/config/versions/magento-2.2.10.js +41 -0
  35. package/lib/config/versions/magento-2.3.0.js +8 -10
  36. package/lib/config/versions/magento-2.3.1.js +8 -10
  37. package/lib/config/versions/magento-2.3.2-p1.js +8 -10
  38. package/lib/config/versions/magento-2.3.2-p2.js +8 -10
  39. package/lib/config/versions/magento-2.3.2.js +8 -10
  40. package/lib/config/versions/magento-2.3.3-p1.js +8 -10
  41. package/lib/config/versions/magento-2.3.3.js +8 -10
  42. package/lib/config/versions/magento-2.3.4-p1.js +8 -10
  43. package/lib/config/versions/magento-2.3.4-p2.js +8 -10
  44. package/lib/config/versions/magento-2.3.4.js +8 -10
  45. package/lib/config/versions/magento-2.3.5-p1.js +8 -10
  46. package/lib/config/versions/magento-2.3.5-p2.js +8 -10
  47. package/lib/config/versions/magento-2.3.5.js +8 -10
  48. package/lib/config/versions/magento-2.3.6-p1.js +8 -10
  49. package/lib/config/versions/magento-2.3.6.js +8 -10
  50. package/lib/config/versions/magento-2.3.7-p1.js +8 -10
  51. package/lib/config/versions/magento-2.3.7-p2.js +8 -10
  52. package/lib/config/versions/magento-2.3.7-p3.js +8 -10
  53. package/lib/config/versions/magento-2.3.7-p4.js +42 -0
  54. package/lib/config/versions/magento-2.3.7.js +8 -10
  55. package/lib/config/versions/magento-2.4.0-p1.js +8 -10
  56. package/lib/config/versions/magento-2.4.0.js +8 -10
  57. package/lib/config/versions/magento-2.4.1-p1.js +8 -10
  58. package/lib/config/versions/magento-2.4.1.js +8 -10
  59. package/lib/config/versions/magento-2.4.2-p1.js +8 -10
  60. package/lib/config/versions/magento-2.4.2-p2.js +8 -10
  61. package/lib/config/versions/magento-2.4.2.js +8 -10
  62. package/lib/config/versions/magento-2.4.3-p1.js +8 -10
  63. package/lib/config/versions/magento-2.4.3-p2.js +8 -10
  64. package/lib/config/versions/magento-2.4.3-p3.js +44 -0
  65. package/lib/config/versions/magento-2.4.3.js +8 -10
  66. package/lib/config/versions/magento-2.4.4-p1.js +44 -0
  67. package/lib/config/versions/magento-2.4.4.js +8 -10
  68. package/lib/config/versions/magento-2.4.5.js +44 -0
  69. package/lib/tasks/cli/create-bashrc-config.js +4 -2
  70. package/lib/tasks/composer/local-auth-json.js +1 -1
  71. package/lib/tasks/database/connect-to-database.js +6 -3
  72. package/lib/tasks/database/create-magento-database.js +5 -2
  73. package/lib/tasks/database/create-magento-user.js +50 -0
  74. package/lib/tasks/database/default-magento-database.js +3 -0
  75. package/lib/tasks/database/default-magento-user.js +7 -0
  76. package/lib/tasks/database/import-dump-to-database.js +3 -2
  77. package/lib/tasks/docker/api.d.ts +25 -1
  78. package/lib/tasks/docker/api.js +31 -1
  79. package/lib/tasks/docker/containers/container-api.d.ts +21 -0
  80. package/lib/tasks/docker/containers/container-api.js +82 -17
  81. package/lib/tasks/docker/containers/tasks.js +44 -13
  82. package/lib/tasks/docker/convert-composer-home-to-composer-cache-volume.js +52 -0
  83. package/lib/tasks/docker/convert-mysql-to-mariadb.js +2 -2
  84. package/lib/tasks/docker/image/image-api.d.ts +44 -0
  85. package/lib/tasks/docker/image/image-api.js +30 -2
  86. package/lib/tasks/docker/index.js +6 -1
  87. package/lib/tasks/docker/project-image-builder.js +37 -14
  88. package/lib/tasks/docker/system/index.js +5 -0
  89. package/lib/tasks/docker/system/system-api.d.ts +71 -0
  90. package/lib/tasks/docker/system/system-api.js +29 -0
  91. package/lib/tasks/docker/volume/index.js +2 -1
  92. package/lib/tasks/docker/volume/tasks.js +67 -9
  93. package/lib/tasks/docker/volume/volume-api.d.ts +40 -0
  94. package/lib/tasks/docker/volume/volume-api.js +54 -1
  95. package/lib/tasks/execute.js +100 -0
  96. package/lib/tasks/file-system/create-nginx-config.js +3 -5
  97. package/lib/tasks/file-system/create-php-config.js +2 -23
  98. package/lib/tasks/file-system/create-php-debug-config.js +45 -0
  99. package/lib/tasks/file-system/create-php-fpm-config.js +2 -4
  100. package/lib/tasks/file-system/create-phpstorm-config/exclude-folder-config.js +13 -3
  101. package/lib/tasks/file-system/create-phpstorm-config/index.js +2 -1
  102. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-workspace-project-configuration-config.js +1 -1
  103. package/lib/tasks/file-system/create-ssl-terminator-config.js +4 -7
  104. package/lib/tasks/file-system/create-varnish-config.js +4 -7
  105. package/lib/tasks/file-system/create-vscode-config.js +2 -1
  106. package/lib/tasks/file-system/index.js +3 -2
  107. package/lib/tasks/magento/enable-magento-composer-plugins.js +85 -30
  108. package/lib/tasks/magento/install-magento-project.js +3 -2
  109. package/lib/tasks/magento/setup-magento/configure-elasticsearch.js +2 -4
  110. package/lib/tasks/magento/setup-magento/flush-redis-config.js +3 -6
  111. package/lib/tasks/magento/setup-magento/index.js +2 -0
  112. package/lib/tasks/magento/setup-magento/install-magento.js +8 -13
  113. package/lib/tasks/magento/setup-magento/set-base-url.js +1 -1
  114. package/lib/tasks/magento/setup-magento/set-mail-config.js +22 -0
  115. package/lib/tasks/magento/setup-magento/varnish-config.js +4 -9
  116. package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +17 -16
  117. package/lib/tasks/php/php-container.js +7 -3
  118. package/lib/tasks/php/update-env-php.js +3 -4
  119. package/lib/tasks/{prefix → project-config}/index.js +6 -6
  120. package/lib/tasks/requirements/composer-credentials.js +7 -3
  121. package/lib/tasks/requirements/docker/context.js +88 -0
  122. package/lib/tasks/requirements/docker/index.js +114 -20
  123. package/lib/tasks/requirements/docker/install.js +21 -7
  124. package/lib/tasks/requirements/docker/permissions.js +2 -11
  125. package/lib/tasks/requirements/docker/running-status.js +94 -24
  126. package/lib/tasks/requirements/docker/version.js +1 -0
  127. package/lib/tasks/requirements/index.js +0 -2
  128. package/lib/tasks/requirements/php-version.js +4 -2
  129. package/lib/tasks/start.js +27 -8
  130. package/lib/tasks/status/index.js +60 -21
  131. package/lib/tasks/stop.js +2 -0
  132. package/lib/tasks/theme/retrieve-theme-data.js +12 -2
  133. package/lib/util/config-file-validator.js +17 -3
  134. package/lib/util/execute-in-container.js +62 -0
  135. package/lib/util/instance-metadata.js +14 -2
  136. package/lib/util/systemctl.js +62 -13
  137. package/package.json +4 -3
  138. package/typings/context.d.ts +11 -0
  139. package/typings/index.d.ts +46 -1
  140. package/lib/tasks/execute/index.js +0 -26
  141. package/lib/tasks/requirements/dependency/arch.js +0 -50
  142. package/lib/tasks/requirements/dependency/centos.js +0 -36
  143. package/lib/tasks/requirements/dependency/fedora.js +0 -36
  144. package/lib/tasks/requirements/dependency/index.js +0 -33
  145. package/lib/tasks/requirements/dependency/mac.js +0 -124
  146. package/lib/tasks/requirements/dependency/ubuntu.js +0 -83
package/exec.js ADDED
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env node
2
+
3
+ const getLatestVersion = require('@scandipwa/scandipwa-dev-utils/latest-version');
4
+ const logger = require('@scandipwa/scandipwa-dev-utils/logger');
5
+ const semver = require('semver');
6
+ const isInstalledGlobally = require('is-installed-globally');
7
+ const isRunningRoot = require('./lib/util/is-running-root');
8
+ const { executeTask } = require('./lib/tasks/execute');
9
+
10
+ if (isRunningRoot()) {
11
+ logger.error('Root privileges detected!');
12
+ console.log(`
13
+ We detected that you are running ${ logger.style.misc('magento-scripts') } as root user.
14
+ We cannot allow you to run ${ logger.style.misc('magento-scripts') } with root privileges, this will only cause more problems.
15
+
16
+ If you are experiencing problems with ${ logger.style.misc('Docker') } or ${ logger.style.misc('Magento') } setup, running ${ logger.style.misc('magento-scripts') } as root will not solve those problems.
17
+ `);
18
+
19
+ process.exit(1);
20
+ }
21
+
22
+ process.title = 'magento-scripts';
23
+
24
+ const newVersionIsAPatch = (latestVersion, currentVersion) => {
25
+ const latestVersionParsed = semver.parse(latestVersion);
26
+ const currentVersionParsed = semver.parse(currentVersion);
27
+
28
+ return latestVersionParsed.major === currentVersionParsed.major
29
+ && latestVersionParsed.minor === currentVersionParsed.minor
30
+ && latestVersionParsed.patch !== currentVersionParsed.patch;
31
+ };
32
+
33
+ (async () => {
34
+ const { version: currentVersion, name } = require('./package.json');
35
+ try {
36
+ const latestVersion = await getLatestVersion(name);
37
+
38
+ if (semver.gt(latestVersion, currentVersion)) {
39
+ const isNewVersionAPath = newVersionIsAPatch(latestVersion, currentVersion);
40
+
41
+ let message = [];
42
+
43
+ if (isNewVersionAPath) {
44
+ message = [
45
+ `A patch for ${ logger.style.misc(name) } is available!`,
46
+ `We recommend to update to latest version ${ logger.style.misc(latestVersion) }!`,
47
+ `-> ${ logger.style.command(`npm i ${ isInstalledGlobally ? '-g ' : '' }${ name }@${ latestVersion }`) }`
48
+ ];
49
+ } else {
50
+ message = [
51
+ `${ isInstalledGlobally ? 'Global module' : 'Module' } ${ logger.style.misc(name) } (${currentVersion}) is out-dated.`,
52
+ `Please upgrade it to latest version ${ logger.style.misc(latestVersion) }.`,
53
+ `You can do it by running the following command: ${ logger.style.command(`npm i ${ isInstalledGlobally ? '-g ' : '' }${ name }@${ latestVersion }`) }.`
54
+ ];
55
+ }
56
+
57
+ process.isOutOfDateVersion = true;
58
+ process.isOutOfDateVersionMessage = message;
59
+ }
60
+ } catch (e) {
61
+ logger.warn(`Package ${ logger.style.misc(name) } is not yet published.`);
62
+ logger.log(); // add empty line
63
+ }
64
+
65
+ const [containername, ...commands] = process.argv.slice(2);
66
+
67
+ return executeTask({
68
+ containername,
69
+ commands
70
+ });
71
+ })();
package/index.js CHANGED
@@ -13,7 +13,7 @@ if (isRunningRoot()) {
13
13
  We detected that you are running ${ logger.style.misc('magento-scripts') } as root user.
14
14
  We cannot allow you to run ${ logger.style.misc('magento-scripts') } with root privileges, this will only cause more problems.
15
15
 
16
- If you are experiencing problems with ${ logger.style.misc('Docker') }, ${ logger.style.misc('PHPBrew') } and ${ logger.style.misc('PHP') } compilation or ${ logger.style.misc('Magento') } setup, running ${ logger.style.misc('magento-scripts') } as root will not solve those problems.
16
+ If you are experiencing problems with ${ logger.style.misc('Docker') } or ${ logger.style.misc('Magento') } setup, running ${ logger.style.misc('magento-scripts') } as root will not solve those problems.
17
17
  `);
18
18
 
19
19
  process.exit(1);
@@ -5,9 +5,9 @@ const getMagentoVersionConfig = require('../config/get-magento-version-config');
5
5
  const logger = require('@scandipwa/scandipwa-dev-utils/logger');
6
6
  const getProjectConfiguration = require('../config/get-project-configuration');
7
7
  const checkConfigurationFile = require('../config/check-configuration-file');
8
- // const { installComposer, installPrestissimo } = require('../tasks/composer');
9
8
  const ConsoleBlock = require('../util/console-block');
10
9
  const { checkComposerCredentials } = require('../tasks/requirements/composer-credentials');
10
+ const pkg = require('../../package.json');
11
11
 
12
12
  /**
13
13
  * @param {import('yargs')} yargs
@@ -42,10 +42,18 @@ module.exports = (yargs) => {
42
42
  block
43
43
  .addHeader('Create Magento App CLI')
44
44
  .addEmptyLine()
45
+ .addLine(`Magento version: ${logger.style.link(ctx.magentoVersion)}`)
46
+ .addLine(`${logger.style.file('magento-scripts')} version: ${logger.style.link(pkg.version)}`)
47
+ .addEmptyLine()
45
48
  .addLine(`Available aliases: ${logger.style.command('php')}, ${logger.style.command('magento')}, ${logger.style.command('composer')}`)
46
49
  .addLine(`Available shortcuts: magento -> ${logger.style.command('m')}, composer -> ${logger.style.command('c')}`)
47
50
  .addEmptyLine();
48
51
 
52
+ block
53
+ .addLine(`Execute into any service: ${logger.style.command('exec <service name>')}`)
54
+ .addLine(`Execute into PHP container: ${logger.style.command('exec php')}`)
55
+ .addEmptyLine();
56
+
49
57
  if (ctx.config.overridenConfiguration.configuration.varnish.enabled) {
50
58
  block.addLine(`Clear Varnish cache: ${logger.style.command('cvc')}`);
51
59
  }
@@ -65,6 +73,15 @@ module.exports = (yargs) => {
65
73
  .addLine(`Connect to MariaDB server as root: ${logger.style.command('mariadbroot')}`)
66
74
  .addEmptyLine();
67
75
 
76
+ if (ctx.debug) {
77
+ block
78
+ .addLine('Debug PHP in CLI:')
79
+ .addLine('1. Start debugger in VSCode or PHPStorm')
80
+ .addLine(`2. Go to PHP container: ${ logger.style.command('exec php') }`)
81
+ .addLine(`3. Run CLI command with ${ logger.style.code('XDEBUG_SESSION=phpstorm') } environmental variable: ${ logger.style.command('XDEBUG_SESSION=phpstorm magento <command>') }`)
82
+ .addLine('4. Enjoy');
83
+ }
84
+
68
85
  block.log();
69
86
 
70
87
  return cli();
@@ -1,11 +1,4 @@
1
- const logger = require('@scandipwa/scandipwa-dev-utils/logger');
2
- const { Listr } = require('listr2');
3
- const checkConfigurationFile = require('../config/check-configuration-file');
4
- const getProjectConfiguration = require('../config/get-project-configuration');
5
- const executeInContainer = require('../tasks/execute');
6
- const getMagentoVersionConfig = require('../config/get-magento-version-config');
7
- const { checkRequirements } = require('../tasks/requirements');
8
- const { getCachedPorts } = require('../config/get-port-config');
1
+ const { executeTask } = require('../tasks/execute');
9
2
 
10
3
  /**
11
4
  * @param {import('yargs')} yargs
@@ -26,55 +19,7 @@ Available containers:
26
19
  - sslTerminator`);
27
20
  },
28
21
  async (argv) => {
29
- const tasks = new Listr([
30
- checkRequirements(),
31
- getMagentoVersionConfig(),
32
- checkConfigurationFile(),
33
- getProjectConfiguration(),
34
- getCachedPorts()
35
- ], {
36
- concurrent: false,
37
- exitOnError: true,
38
- ctx: { throwMagentoVersionMissing: true },
39
- rendererOptions: { collapse: false, clearOutput: true }
40
- });
41
-
42
- let ctx;
43
- try {
44
- ctx = await tasks.run();
45
- } catch (e) {
46
- logger.error(e.message || e);
47
- process.exit(1);
48
- }
49
- const containers = ctx.config.docker.getContainers(ctx.ports);
50
- const services = Object.keys(containers);
51
-
52
- if (services.includes(argv.containername) || services.some((service) => service.includes(argv.containername))) {
53
- const container = containers[argv.containername]
54
- ? containers[argv.containername]
55
- : Object.entries(containers).find(([key]) => key.includes(argv.containername))[1];
56
-
57
- if (argv.commands.length === 0) {
58
- // if we have default connect command then use it
59
- if (container.connectCommand) {
60
- // eslint-disable-next-line no-param-reassign
61
- argv.commands = container.connectCommand;
62
- } else {
63
- // otherwise fall back to bash (if it exists inside container)
64
- argv.commands.push('bash');
65
- }
66
- }
67
-
68
- logger.logN(`Executing container ${logger.style.misc(container._)} (command: ${logger.style.command(argv.commands[0])})`);
69
- await executeInContainer({
70
- containerName: container.name,
71
- commands: argv.commands
72
- });
73
-
74
- return;
75
- }
76
-
77
- logger.error(`No container found "${argv.containername}"`);
22
+ await executeTask(argv);
78
23
  }
79
24
  );
80
25
  };
@@ -1,6 +1,12 @@
1
1
  const logger = require('@scandipwa/scandipwa-dev-utils/logger');
2
- const { docker } = require('../config');
2
+ const { Listr } = require('listr2');
3
+ const { checkRequirements } = require('../tasks/requirements');
4
+ const getMagentoVersionConfig = require('../config/get-magento-version-config');
3
5
  const { execAsyncSpawn } = require('../util/exec-async-command');
6
+ const checkConfigurationFile = require('../config/check-configuration-file');
7
+ const getProjectConfiguration = require('../config/get-project-configuration');
8
+ const { getCachedPorts } = require('../config/get-port-config');
9
+ const dockerNetwork = require('../tasks/docker/network');
4
10
 
5
11
  /**
6
12
  * @param {import('yargs')} yargs
@@ -77,7 +83,27 @@ npm run logs re (will match redis)`);
77
83
  );
78
84
  },
79
85
  async (argv) => {
80
- const containers = (await docker).getContainers();
86
+ const tasks = new Listr([
87
+ checkRequirements(),
88
+ getMagentoVersionConfig(),
89
+ checkConfigurationFile(),
90
+ getProjectConfiguration(),
91
+ getCachedPorts(),
92
+ dockerNetwork.tasks.createNetwork()
93
+ ], {
94
+ concurrent: false,
95
+ exitOnError: true,
96
+ ctx: { throwMagentoVersionMissing: true },
97
+ rendererOptions: { collapse: false, clearOutput: true }
98
+ });
99
+ let ctx;
100
+ try {
101
+ ctx = await tasks.run();
102
+ } catch (e) {
103
+ logger.error(e.message || e);
104
+ process.exit(1);
105
+ }
106
+ const containers = ctx.config.docker.getContainers();
81
107
  const services = Object.keys(containers);
82
108
 
83
109
  if (services.includes(argv.scope) || services.some((service) => service.includes(argv.scope))) {
@@ -22,6 +22,7 @@ const reportErrors = async (errors) => {
22
22
  const path = (error.path && ` Error path: ${error.path} `) || '';
23
23
  if (error instanceof UnknownError || error instanceof KnownError) {
24
24
  logger.error(error.message);
25
+ logger.error(error.stack);
25
26
  if (error instanceof UnknownError) {
26
27
  await googleAnalytics.trackError(`Unknown Error:${path}${error.stack}`);
27
28
  } else {
@@ -29,9 +30,11 @@ const reportErrors = async (errors) => {
29
30
  }
30
31
  } else if (error instanceof Error) {
31
32
  logger.error(error.message);
33
+ logger.error(error.stack);
32
34
  await googleAnalytics.trackError(`Regular Error:${path}${error.message}`);
33
35
  } else {
34
36
  logger.error(error);
37
+ logger.error(error.stack);
35
38
  await googleAnalytics.trackError(`Non Error:${path}${error}`); // track non-errors throws
36
39
  }
37
40
  }
@@ -83,6 +86,16 @@ module.exports = (yargs) => {
83
86
  describe: 'Enable verbose logging',
84
87
  type: 'boolean',
85
88
  default: false
89
+ })
90
+ .option('pull-images', {
91
+ describe: 'Pull Docker images',
92
+ type: 'boolean',
93
+ default: false
94
+ })
95
+ .option('reset-global-config', {
96
+ describe: 'Reset global magento-scripts configuration',
97
+ type: 'boolean',
98
+ default: false
86
99
  }),
87
100
  async (args = {}) => {
88
101
  /**
@@ -137,6 +150,13 @@ module.exports = (yargs) => {
137
150
  block.addLine(` ${title}: ${text}`);
138
151
  });
139
152
 
153
+ block.addEmptyLine();
154
+
155
+ block.addLine(logger.style.misc('MailDev'));
156
+ instanceMetadata.maildev.forEach(({ title, text }) => {
157
+ block.addLine(` ${title}: ${text}`);
158
+ });
159
+
140
160
  const themes = await getCSAThemes();
141
161
  if (themes.length > 0) {
142
162
  const theme = themes[0];
@@ -170,10 +190,11 @@ module.exports = (yargs) => {
170
190
  );
171
191
  logger.log('');
172
192
 
173
- if (!analytics && tasks.err && tasks.err.length > 0) {
174
- logger.warn('You have disabled analytics, but we\'ve encountered errors during startup!');
193
+ if (tasks.err && tasks.err.length > 0) {
194
+ logger.warn('During the start, we encountered some errors that have not impacted the start-up process!');
195
+ logger.log('');
175
196
  for (const err of tasks.err) {
176
- logger.error(`${err.path}\n${err.message}\n\n${err.stack}`);
197
+ logger.error(`Error path: ${err.path}\nError message: ${err.message}\n\nError stack: ${err.stack}`);
177
198
  }
178
199
  }
179
200
 
@@ -9,6 +9,7 @@ const { statusContainers } = require('../tasks/docker/containers');
9
9
  const getProjectConfiguration = require('../config/get-project-configuration');
10
10
  const checkConfigurationFile = require('../config/check-configuration-file');
11
11
  const checkPHPVersion = require('../tasks/requirements/php-version');
12
+ const { getComposerVersionTask } = require('../tasks/composer');
12
13
 
13
14
  /**
14
15
  * @param {import('yargs')} yargs
@@ -21,7 +22,14 @@ module.exports = (yargs) => {
21
22
  checkConfigurationFile(),
22
23
  getProjectConfiguration(),
23
24
  getCachedPorts(),
24
- checkPHPVersion(),
25
+ {
26
+ task: (ctx, task) => task.newListr([
27
+ checkPHPVersion(),
28
+ getComposerVersionTask()
29
+ ], {
30
+ concurrent: true
31
+ })
32
+ },
25
33
  statusContainers()
26
34
  ], {
27
35
  concurrent: false,
@@ -2,6 +2,16 @@ const Conf = require('conf');
2
2
 
3
3
  const pkg = require('../../package.json');
4
4
 
5
+ /**
6
+ * @typedef ProjectConfig
7
+ * @prop {String} [createdAt]
8
+ * @prop {String} [prefix]
9
+ * @prop {Boolean} debug
10
+ */
11
+
12
+ /**
13
+ * @type {import('conf').default<Record<string, ProjectConfig>>}
14
+ */
5
15
  const projectsConfig = new Conf({
6
16
  configName: 'projects',
7
17
  projectName: 'create-magento-app',
@@ -10,6 +20,12 @@ const projectsConfig = new Conf({
10
20
  });
11
21
  const projectKey = process.cwd();
12
22
 
23
+ const setProjectConfig = (key, value) => {
24
+ projectsConfig.set(`${projectKey}.${key}`, value);
25
+ };
26
+
27
+ const getProjectConfig = () => projectsConfig.get(projectKey);
28
+
13
29
  const getProjectsFromProjectKeys = (path, project) => {
14
30
  if (project.createdAt) {
15
31
  return { [path]: project };
@@ -21,7 +37,7 @@ const getProjectsFromProjectKeys = (path, project) => {
21
37
  };
22
38
  /**
23
39
  *
24
- * @returns {Record<string, { createdAt?: string, prefix?: string}>}
40
+ * @returns {Record<string, ProjectConfig>}
25
41
  */
26
42
  const getProjects = () => {
27
43
  const projects = {};
@@ -45,5 +61,7 @@ const getProjects = () => {
45
61
  module.exports = {
46
62
  projectsConfig,
47
63
  projectKey,
48
- getProjects
64
+ getProjects,
65
+ setProjectConfig,
66
+ getProjectConfig
49
67
  };