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

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 (226) hide show
  1. package/lib/commands/cli.js +4 -6
  2. package/lib/commands/execute.js +29 -4
  3. package/lib/commands/import-db.js +1 -1
  4. package/lib/commands/logs.js +1 -1
  5. package/lib/commands/start.js +38 -20
  6. package/lib/commands/status.js +2 -0
  7. package/lib/config/docker.js +102 -84
  8. package/lib/config/get-project-configuration.js +3 -1
  9. package/lib/config/index.js +10 -7
  10. package/lib/config/magento/required-php-extensions/index.js +29 -0
  11. package/lib/config/magento/required-php-extensions/magento-2.3.js +19 -0
  12. package/lib/config/magento/required-php-extensions/magento-2.4.js +29 -0
  13. package/lib/config/php/base-repo.js +3 -0
  14. package/lib/config/php/extensions/apcu.js +12 -0
  15. package/lib/config/php/extensions/bcmath.js +7 -0
  16. package/lib/config/php/extensions/curl.js +11 -0
  17. package/lib/config/php/extensions/gd.js +14 -0
  18. package/lib/config/php/extensions/index.js +18 -2
  19. package/lib/config/php/extensions/intl.js +10 -0
  20. package/lib/config/php/extensions/opcache.js +10 -0
  21. package/lib/config/php/extensions/pdo_mysql.js +7 -0
  22. package/lib/config/php/extensions/soap.js +10 -0
  23. package/lib/config/php/extensions/sodium.js +10 -0
  24. package/lib/config/php/extensions/xdebug.js +8 -5
  25. package/lib/config/php/extensions/xsl.js +10 -0
  26. package/lib/config/php/extensions/zip.js +10 -0
  27. package/lib/config/php/{releases → versions}/index.js +0 -0
  28. package/lib/config/php/versions/php-7.2.js +23 -0
  29. package/lib/config/php/versions/php-7.3.js +23 -0
  30. package/lib/config/php/versions/php-7.4.js +23 -0
  31. package/lib/config/php/versions/php-8.1.js +23 -0
  32. package/lib/config/php-config.js +8 -12
  33. package/lib/config/port-config.js +2 -6
  34. package/lib/config/services/elasticsearch/base-repo.js +3 -0
  35. package/lib/config/services/elasticsearch/default-es-env.js +6 -0
  36. package/lib/config/services/elasticsearch/versions/elasticsearch-6.8.js +19 -0
  37. package/lib/config/services/elasticsearch/versions/index.js +5 -0
  38. package/lib/config/templates/magentorc.template +5 -5
  39. package/lib/config/templates/mariadb.template.cnf +191 -0
  40. package/lib/config/templates/php-fpm.template.conf +3 -3
  41. package/lib/config/templates/php.template.ini +12 -6
  42. package/lib/config/templates/ssl-terminator.template.conf +1 -1
  43. package/lib/config/templates/vscode-launch.template.json +3 -1
  44. package/lib/config/versions/magento-2.3.0.js +10 -5
  45. package/lib/config/versions/magento-2.3.1.js +10 -5
  46. package/lib/config/versions/magento-2.3.2-p1.js +43 -0
  47. package/lib/config/versions/magento-2.3.2-p2.js +10 -5
  48. package/lib/config/versions/magento-2.3.2.js +10 -5
  49. package/lib/config/versions/magento-2.3.3-p1.js +10 -5
  50. package/lib/config/versions/magento-2.3.3.js +10 -5
  51. package/lib/config/versions/magento-2.3.4-p1.js +43 -0
  52. package/lib/config/versions/magento-2.3.4-p2.js +10 -5
  53. package/lib/config/versions/magento-2.3.4.js +10 -5
  54. package/lib/config/versions/magento-2.3.5-p1.js +8 -2
  55. package/lib/config/versions/magento-2.3.5-p2.js +8 -2
  56. package/lib/config/versions/magento-2.3.5.js +8 -2
  57. package/lib/config/versions/magento-2.3.6-p1.js +8 -2
  58. package/lib/config/versions/magento-2.3.6.js +8 -2
  59. package/lib/config/versions/magento-2.3.7-p1.js +8 -2
  60. package/lib/config/versions/magento-2.3.7-p2.js +8 -2
  61. package/lib/config/versions/magento-2.3.7-p3.js +8 -2
  62. package/lib/config/versions/magento-2.3.7.js +8 -2
  63. package/lib/config/versions/magento-2.4.0-p1.js +9 -3
  64. package/lib/config/versions/magento-2.4.0.js +9 -3
  65. package/lib/config/versions/magento-2.4.1-p1.js +6 -5
  66. package/lib/config/versions/magento-2.4.1.js +9 -2
  67. package/lib/config/versions/magento-2.4.2-p1.js +6 -5
  68. package/lib/config/versions/magento-2.4.2-p2.js +6 -6
  69. package/lib/config/versions/magento-2.4.2.js +6 -6
  70. package/lib/config/versions/magento-2.4.3-p1.js +7 -7
  71. package/lib/config/versions/magento-2.4.3-p2.js +7 -7
  72. package/lib/config/versions/magento-2.4.3.js +7 -7
  73. package/lib/config/versions/magento-2.4.4.js +9 -2
  74. package/lib/tasks/cleanup.js +3 -3
  75. package/lib/tasks/composer/index.js +14 -104
  76. package/lib/tasks/database/connect-to-database.js +117 -0
  77. package/lib/tasks/database/create-magento-database.js +18 -0
  78. package/lib/tasks/{mysql → database}/dump-theme-config.js +3 -3
  79. package/lib/tasks/{mysql → database}/fix-db.js +2 -2
  80. package/lib/tasks/{mysql/import-dump-to-mysql.js → database/import-dump-to-database.js} +65 -22
  81. package/lib/tasks/{mysql → database}/import-remote-db/index.js +0 -0
  82. package/lib/tasks/{mysql/import-remote-db/ssh/mysqldump-command.js → database/import-remote-db/ssh/database-dump-command.js} +2 -2
  83. package/lib/tasks/{mysql → database}/import-remote-db/ssh/index.js +0 -0
  84. package/lib/tasks/{mysql → database}/import-remote-db/ssh/readymage.js +4 -4
  85. package/lib/tasks/{mysql → database}/import-remote-db/ssh/regular-server.js +2 -2
  86. package/lib/tasks/{mysql → database}/index.js +2 -2
  87. package/lib/tasks/{mysql → database}/magento-tables.js +0 -0
  88. package/lib/tasks/{mysql → database}/restore-theme-config.js +4 -4
  89. package/lib/tasks/docker/api.d.ts +71 -0
  90. package/lib/tasks/docker/api.js +30 -0
  91. package/lib/tasks/docker/containers/container-api.d.ts +128 -0
  92. package/lib/tasks/docker/containers/container-api.js +153 -0
  93. package/lib/tasks/docker/containers/index.js +19 -0
  94. package/lib/tasks/docker/containers/tasks.js +215 -0
  95. package/lib/tasks/docker/convert-legacy-volumes.js +15 -10
  96. package/lib/tasks/docker/convert-mysql-to-mariadb.js +284 -0
  97. package/lib/tasks/docker/image/image-api.d.ts +34 -0
  98. package/lib/tasks/docker/image/image-api.js +49 -0
  99. package/lib/tasks/docker/image/index.js +5 -0
  100. package/lib/tasks/docker/index.js +1 -13
  101. package/lib/tasks/docker/network/index.js +7 -0
  102. package/lib/tasks/docker/network/network-api.d.ts +103 -0
  103. package/lib/tasks/docker/network/network-api.js +99 -0
  104. package/lib/tasks/docker/{network.js → network/tasks.js} +17 -10
  105. package/lib/tasks/docker/project-image-builder.js +167 -0
  106. package/lib/tasks/docker/volume/index.js +8 -0
  107. package/lib/tasks/docker/{volumes.js → volume/tasks.js} +5 -19
  108. package/lib/tasks/docker/volume/volume-api.d.ts +39 -0
  109. package/lib/tasks/docker/volume/volume-api.js +66 -0
  110. package/lib/tasks/execute/index.js +5 -2
  111. package/lib/tasks/file-system/create-mariadb-config.js +23 -0
  112. package/lib/tasks/file-system/create-nginx-config.js +2 -3
  113. package/lib/tasks/file-system/create-php-config.js +20 -5
  114. package/lib/tasks/file-system/create-php-fpm-config.js +8 -4
  115. package/lib/tasks/file-system/create-phpstorm-config/exclude-folder-config.js +41 -29
  116. package/lib/tasks/file-system/create-phpstorm-config/index.js +2 -0
  117. package/lib/tasks/file-system/create-phpstorm-config/keys.js +15 -1
  118. package/lib/tasks/file-system/create-phpstorm-config/php-config/index.js +4 -1
  119. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-config.js +3 -3
  120. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-interpreters-config.js +81 -0
  121. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/index.js +42 -0
  122. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/php-docker-settings-config.js +9 -0
  123. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/setup-php-docker-container-settings-config.js +66 -0
  124. package/lib/tasks/file-system/create-phpstorm-config/setup-xml-structure.js +11 -9
  125. package/lib/tasks/file-system/create-phpstorm-config/stylelint-config.js +2 -1
  126. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/composer-settings-config.js +15 -30
  127. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/index.js +24 -5
  128. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/mess-detector-project-configuration-config.js +50 -0
  129. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-code-sniffer-project-configuration-config.js +50 -0
  130. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-cs-fixer-project-configuration-config.js +50 -0
  131. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-debug-general-config.js +15 -15
  132. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-server-config.js +29 -3
  133. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-stan-project-configuration-config.js.js +50 -0
  134. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-workspace-project-configuration-config.js +42 -0
  135. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/psalm-project-configuration-config.js.js +50 -0
  136. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/workspace-config.js +0 -2
  137. package/lib/tasks/file-system/create-ssl-terminator-config.js +4 -2
  138. package/lib/tasks/file-system/create-vscode-config.js +57 -42
  139. package/lib/tasks/file-system/index.js +5 -2
  140. package/lib/tasks/import-dump.js +6 -6
  141. package/lib/tasks/link.js +5 -4
  142. package/lib/tasks/magento/install-magento-project.js +31 -63
  143. package/lib/tasks/magento/setup-magento/adjust-full-page-cache.js +4 -4
  144. package/lib/tasks/magento/setup-magento/configure-elasticsearch.js +7 -3
  145. package/lib/tasks/magento/setup-magento/create-admin.js +5 -6
  146. package/lib/tasks/magento/setup-magento/delete-admin-users.js +2 -2
  147. package/lib/tasks/magento/setup-magento/delete-customers.js +4 -4
  148. package/lib/tasks/magento/setup-magento/delete-orders.js +4 -4
  149. package/lib/tasks/magento/setup-magento/disable-2fa.js +3 -5
  150. package/lib/tasks/magento/setup-magento/disable-maintenance-mode.js +3 -4
  151. package/lib/tasks/magento/setup-magento/increase-admin-session-lifetime.js +2 -2
  152. package/lib/tasks/magento/setup-magento/index.js +2 -0
  153. package/lib/tasks/magento/setup-magento/install-magento.js +21 -20
  154. package/lib/tasks/magento/setup-magento/migrate-database.js +7 -14
  155. package/lib/tasks/magento/setup-magento/set-base-url.js +2 -2
  156. package/lib/tasks/magento/setup-magento/set-deployment-mode.js +4 -4
  157. package/lib/tasks/magento/setup-magento/set-url-rewrite.js +2 -2
  158. package/lib/tasks/magento/setup-magento/varnish-config.js +10 -8
  159. package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +128 -3
  160. package/lib/tasks/php/php-container.js +108 -0
  161. package/lib/tasks/php/update-env-php.js +39 -21
  162. package/lib/tasks/php/update-env.php +66 -61
  163. package/lib/tasks/php/working_health_check.php +85 -0
  164. package/lib/tasks/requirements/{composer.js → composer-credentials.js} +3 -1
  165. package/lib/tasks/requirements/docker/index.js +15 -12
  166. package/lib/tasks/requirements/docker/performance.js +54 -0
  167. package/lib/tasks/requirements/docker/version.js +8 -8
  168. package/lib/tasks/requirements/index.js +5 -8
  169. package/lib/tasks/requirements/php-version.js +8 -116
  170. package/lib/tasks/requirements/platform.js +12 -25
  171. package/lib/tasks/start.js +21 -50
  172. package/lib/tasks/status/index.js +8 -12
  173. package/lib/tasks/stop.js +0 -2
  174. package/lib/tasks/theme/install-theme.js +1 -1
  175. package/lib/tasks/theme/link-theme.js +2 -2
  176. package/lib/tasks/theme/symlink-theme.js +2 -3
  177. package/lib/util/config-file-validator.js +27 -13
  178. package/lib/util/config-php-json.js +13 -4
  179. package/lib/util/database.js +7 -7
  180. package/lib/util/dockerfile-builder/build-instructions.js +197 -0
  181. package/lib/util/dockerfile-builder/index.js +276 -0
  182. package/lib/util/dockerfile-builder/types.d.ts +123 -0
  183. package/lib/util/env-php-json.js +10 -6
  184. package/lib/util/exec-async-command.js +3 -9
  185. package/lib/util/macos-version.js +20 -0
  186. package/lib/util/magento-task.js +3 -4
  187. package/lib/util/nginx-logs-parser.js +122 -0
  188. package/lib/util/php-task.js +3 -6
  189. package/lib/util/run-composer.js +6 -14
  190. package/lib/util/run-container-image.js +17 -0
  191. package/lib/util/run-magento.js +6 -14
  192. package/lib/util/run-php.js +6 -17
  193. package/package.json +9 -9
  194. package/typings/context.d.ts +7 -13
  195. package/typings/index.d.ts +67 -85
  196. package/yarn-error.log +9660 -0
  197. package/lib/config/composer.js +0 -11
  198. package/lib/config/php/extensions/libsodium.js +0 -36
  199. package/lib/config/php/releases/php-7.2.js +0 -25
  200. package/lib/config/php/releases/php-7.3.js +0 -25
  201. package/lib/config/php/releases/php-7.4.js +0 -23
  202. package/lib/config/php/releases/php-8.1.js +0 -25
  203. package/lib/config/phpbrew.js +0 -12
  204. package/lib/tasks/composer/install-prestissimo.js +0 -103
  205. package/lib/tasks/docker/containers.js +0 -231
  206. package/lib/tasks/mysql/connect-to-mysql.js +0 -114
  207. package/lib/tasks/mysql/create-magento-database.js +0 -18
  208. package/lib/tasks/php/bundled-extensions.js +0 -27
  209. package/lib/tasks/php/compile-options.js +0 -56
  210. package/lib/tasks/php/compile.js +0 -55
  211. package/lib/tasks/php/configure.js +0 -89
  212. package/lib/tasks/php/extensions/disable.js +0 -49
  213. package/lib/tasks/php/extensions/enable.js +0 -52
  214. package/lib/tasks/php/extensions/index.js +0 -80
  215. package/lib/tasks/php/extensions/install.js +0 -54
  216. package/lib/tasks/php/index.js +0 -79
  217. package/lib/tasks/php/install-sodium.js +0 -93
  218. package/lib/tasks/php/update-phpbrew.js +0 -45
  219. package/lib/tasks/php/validate-php.js +0 -67
  220. package/lib/tasks/php-fpm/get-process-id.js +0 -14
  221. package/lib/tasks/php-fpm/index.js +0 -4
  222. package/lib/tasks/php-fpm/start-php-fpm.js +0 -49
  223. package/lib/tasks/php-fpm/stop-php-fpm.js +0 -48
  224. package/lib/tasks/requirements/phpbrew/index.js +0 -61
  225. package/lib/tasks/requirements/phpbrew/install.js +0 -159
  226. package/lib/tasks/requirements/phpbrew/version.js +0 -28
@@ -25,19 +25,16 @@ const parsePort = (port) => {
25
25
  const prettyStatus = async (ctx) => {
26
26
  const {
27
27
  config: {
28
- baseConfig,
29
- php,
30
- composer
28
+ baseConfig
31
29
  },
32
30
  magentoVersion,
33
31
  dockerVersion,
34
- PHPBrewVersion,
35
32
  platform,
36
33
  platformVersion,
37
34
  containers
38
35
  } = ctx;
39
36
  const projectCreatedAt = getProjectCreatedAt();
40
- const composerVersion = await getComposerVersion({ composer, php });
37
+ const composerVersion = await getComposerVersion(ctx);
41
38
 
42
39
  const prefix = getPrefix();
43
40
 
@@ -48,7 +45,7 @@ const prettyStatus = async (ctx) => {
48
45
  block
49
46
  .addHeader(`magento-scripts version: ${ logger.style.link(packageVersion) }`)
50
47
  .addEmptyLine()
51
- .addLine(`Project: ${logger.style.file(baseConfig.prefix)} ${prefix === folderName ? '(without prefix)' : '(with prefix)'}`)
48
+ .addLine(`Project: ${logger.style.file(baseConfig.prefix)} ${prefix === folderName ? '(without prefix)' : '(with prefix)'} (with php container)`)
52
49
  .addLine(`Project location: ${logger.style.link(process.cwd())}`);
53
50
 
54
51
  if (projectCreatedAt) {
@@ -57,12 +54,9 @@ const prettyStatus = async (ctx) => {
57
54
 
58
55
  block
59
56
  .addLine(`Magento 2 version: ${logger.style.file(magentoVersion)}`)
60
- .addLine(`PHP version: ${logger.style.file(php.version)}`)
61
- .addLine(`PHP location: ${logger.style.link(php.binPath)}`)
57
+ .addLine(`PHP version: ${logger.style.file(ctx.phpVersion)}`)
62
58
  .addLine(`Composer version: ${logger.style.file(composerVersion)}`)
63
- .addLine(`Composer location: ${logger.style.link(path.relative(process.cwd(), composer.binPath))}`)
64
59
  .addLine(`Docker version: ${logger.style.file(dockerVersion)}`)
65
- .addLine(`PHPBrew version: ${logger.style.file(PHPBrewVersion)}`)
66
60
  .addLine(`Platform: ${logger.style.code(platform)}`)
67
61
  .addLine(`Platform version: ${logger.style.file(platformVersion)}`)
68
62
  .addLine(`Platform architecture: ${logger.style.file(getArchSync())}`)
@@ -79,8 +73,10 @@ const prettyStatus = async (ctx) => {
79
73
 
80
74
  if (container.status && container.status.Health) {
81
75
  containerStatus = `✓ ${ logger.style.file(container.status.Health.Status) } and ${ logger.style.file('running') }`;
82
- } else {
76
+ } else if (container.status) {
83
77
  containerStatus = logger.style.file(container.status.Status);
78
+ } else {
79
+ containerStatus = '✖ Not running';
84
80
  }
85
81
 
86
82
  block
@@ -89,7 +85,7 @@ const prettyStatus = async (ctx) => {
89
85
  .addLine(`Image: ${logger.style.file(container.image)}`)
90
86
  .addLine(`Network: ${logger.style.link(container.network)}`);
91
87
 
92
- if (container.forwardedPorts && container.forwardedPorts.length > 0) {
88
+ if (!containerStatus.includes('Not running') && container.forwardedPorts && container.forwardedPorts.length > 0) {
93
89
  block.addLine('Port forwarding:');
94
90
  container.forwardedPorts.forEach((port) => {
95
91
  const { host, hostPort, containerPort } = parsePort(port);
package/lib/tasks/stop.js CHANGED
@@ -1,6 +1,5 @@
1
1
  const { stopServices } = require('./docker');
2
2
  const getMagentoVersionConfig = require('../config/get-magento-version-config');
3
- const { stopPhpFpm } = require('./php-fpm');
4
3
  const getProjectConfiguration = require('../config/get-project-configuration');
5
4
  const checkConfigurationFile = require('../config/check-configuration-file');
6
5
 
@@ -13,7 +12,6 @@ const stop = () => ({
13
12
  getMagentoVersionConfig(),
14
13
  checkConfigurationFile(),
15
14
  getProjectConfiguration(),
16
- stopPhpFpm(),
17
15
  stopServices()
18
16
  ], {
19
17
  concurrent: false,
@@ -18,7 +18,7 @@ const installTheme = (theme) => ({
18
18
  }
19
19
 
20
20
  try {
21
- await runComposerCommand(`require ${theme.composerData.name}`, {
21
+ await runComposerCommand(ctx, `require ${theme.composerData.name}`, {
22
22
  magentoVersion,
23
23
  callback: !verbose ? undefined : (t) => {
24
24
  task.output = t;
@@ -18,7 +18,7 @@ const linkTheme = () => ({
18
18
  absoluteThemePath,
19
19
  themePath,
20
20
  composerData,
21
- mysqlConnection
21
+ databaseConnection
22
22
  } = ctx;
23
23
  const {
24
24
  magento: { edition: magentoEdition },
@@ -27,7 +27,7 @@ const linkTheme = () => ({
27
27
 
28
28
  const isEnterprise = magentoEdition === 'enterprise';
29
29
  const isPageBuilderInstalled = isEnterprise && semver.satisfies(semver.coerce(magentoVersion), '^2.4');
30
- const [queryResult] = await mysqlConnection.query(`
30
+ const [queryResult] = await databaseConnection.query(`
31
31
  SELECT value AS isPagebuilderEnabled
32
32
  FROM core_config_data
33
33
  WHERE path = 'cms/pagebuilder/enabled'
@@ -9,7 +9,7 @@ const runComposerCommand = require('../../util/run-composer');
9
9
  const symlinkTheme = (theme) => ({
10
10
  title: 'Setting symbolic link for theme in composer.json',
11
11
  task: async (ctx, task) => {
12
- const { magentoVersion, verbose = false } = ctx;
12
+ const { verbose = false } = ctx;
13
13
  const composerJsonData = await getJsonfileData(path.join(process.cwd(), 'composer.json'));
14
14
 
15
15
  if (!composerJsonData.repositories) {
@@ -27,8 +27,7 @@ const symlinkTheme = (theme) => ({
27
27
  }
28
28
 
29
29
  try {
30
- await runComposerCommand(`config repo.scandipwa path ${theme.absoluteThemePath}`, {
31
- magentoVersion,
30
+ await runComposerCommand(ctx, `config repo.scandipwa path ${theme.absoluteThemePath}`, {
32
31
  callback: !verbose ? undefined : (t) => {
33
32
  task.output = t;
34
33
  }
@@ -46,10 +46,16 @@ const sslSchema = Joi.object({
46
46
  ssl_certificate_key: Joi.string().required()
47
47
  });
48
48
 
49
+ /**
50
+ * @type {Joi.ObjectSchema<import('../../typings/index').PHPExtensions>}
51
+ */
49
52
  const phpExtensionConfiguration = Joi.object()
50
53
  .pattern(
51
54
  Joi.string(),
52
55
  Joi.object({
56
+ alternativeName: Joi.array().items(Joi.string()).optional(),
57
+ command: Joi.func().optional(),
58
+ dependencies: Joi.array().items(Joi.string()).optional(),
53
59
  version: Joi.string().optional()
54
60
  })
55
61
  .unknown()
@@ -59,38 +65,47 @@ const phpExtensionConfiguration = Joi.object()
59
65
  * @type {Joi.ObjectSchema<import('../../typings').PHPConfiguration>}
60
66
  */
61
67
  const phpConfigurationSchema = Joi.object({
62
- version: Joi.string().optional().custom(versionValidator),
68
+ baseImage: Joi.string().optional(),
69
+ debugImage: Joi.string().optional(),
70
+ fpmConfigTemplate: Joi.string().optional(),
63
71
  configTemplate: Joi.string().optional().custom(fileExistsValidator),
64
- extensions: phpExtensionConfiguration.optional(),
65
- disabledExtensions: Joi.array().items(Joi.string())
72
+ extensions: phpExtensionConfiguration.optional()
66
73
  });
67
74
 
68
75
  /**
69
76
  * @type {Joi.ObjectSchema<import('../../typings').NginxConfiguration>}
70
77
  */
71
78
  const nginxConfigurationSchema = Joi.object({
72
- version: Joi.string().optional(),
79
+ image: Joi.string().optional(),
73
80
  configTemplate: Joi.string().optional().custom(fileExistsValidator)
74
81
  });
75
82
 
76
83
  /**
77
- * @type {Joi.ObjectSchema<import('../../typings').NginxConfiguration>}
84
+ * @type {Joi.ObjectSchema<import('../../typings').VarnishConfiguration>}
78
85
  */
79
86
  const varnishConfigurationSchema = Joi.object({
80
87
  enabled: Joi.boolean().optional(),
81
- version: Joi.string().optional(),
88
+ image: Joi.string().optional(),
82
89
  configTemplate: Joi.string().optional().custom(fileExistsValidator)
83
90
  });
84
91
 
85
92
  /**
86
- * @type {Joi.ObjectSchema<import('../../typings').ServiceWithVersion>}
93
+ * @type {Joi.ObjectSchema<import('../../typings').ServiceWithImage>}
87
94
  */
88
95
  const serviceConfigurationSchema = Joi.object({
89
- version: Joi.string().optional()
96
+ image: Joi.string().optional()
97
+ });
98
+
99
+ /**
100
+ * @type {Joi.ObjectSchema<import('../../typings').ElasticSearchConfiguration>}
101
+ */
102
+ const elasticsearchConfigurationSchema = Joi.object({
103
+ image: Joi.string().optional(),
104
+ env: Joi.object().optional()
90
105
  });
91
106
 
92
107
  /**
93
- * @type {Joi.ObjectSchema<import('../../typings').CMAConfiguration['configuration']['composer']>}
108
+ * @type {Joi.ObjectSchema<import('../../typings').ComposerConfiguration>}
94
109
  */
95
110
  const composerConfigurationSchema = Joi.object({
96
111
  version: Joi.string().optional().custom((value) => {
@@ -108,8 +123,8 @@ const composerConfigurationSchema = Joi.object({
108
123
  const configurationSchema = Joi.object({
109
124
  php: phpConfigurationSchema.optional(),
110
125
  nginx: nginxConfigurationSchema.optional(),
111
- mysql: serviceConfigurationSchema.optional(),
112
- elasticsearch: serviceConfigurationSchema.optional(),
126
+ mariadb: serviceConfigurationSchema.optional(),
127
+ elasticsearch: elasticsearchConfigurationSchema.optional(),
113
128
  redis: serviceConfigurationSchema.optional(),
114
129
  composer: composerConfigurationSchema.optional(),
115
130
  varnish: varnishConfigurationSchema.optional(),
@@ -124,8 +139,7 @@ const configFileSchema = Joi.object({
124
139
  host: Joi.string().optional(),
125
140
  ssl: sslSchema.optional(),
126
141
  prefix: Joi.bool().optional(),
127
- configuration: configurationSchema.required(),
128
- useNonOverlappingPorts: Joi.bool().forbidden()
142
+ configuration: configurationSchema.required()
129
143
  });
130
144
 
131
145
  /**
@@ -1,10 +1,19 @@
1
1
  const path = require('path');
2
2
  const UnknownError = require('../errors/unknown-error');
3
- const runPhpCode = require('./run-php');
3
+ const { runPHPContainerCommand } = require('../tasks/php/php-container');
4
+ const pathExists = require('./path-exists');
4
5
 
5
- const configPhpToJson = async (projectPath = process.cwd(), { magentoVersion }) => {
6
- const { code, result } = await runPhpCode(`-r "echo json_encode(require '${path.join(projectPath, 'app', 'etc', 'config.php')}');"`, {
7
- magentoVersion
6
+ /**
7
+ * @param {import('../../typings/context').ListrContext} ctx
8
+ */
9
+ const configPhpToJson = async (ctx) => {
10
+ const configPhpOnSystemPath = path.join(ctx.config.baseConfig.magentoDir, 'app', 'etc', 'config.php');
11
+ const configPhpInContainerPath = path.join(ctx.config.baseConfig.containerMagentoDir, 'app', 'etc', 'config.php');
12
+ if (!await pathExists(configPhpOnSystemPath)) {
13
+ return null;
14
+ }
15
+ const { code, result } = await runPHPContainerCommand(ctx, `php -r "echo json_encode(require '${configPhpInContainerPath}');"`, {
16
+ withCode: true
8
17
  });
9
18
 
10
19
  if (code !== 0) {
@@ -4,8 +4,8 @@
4
4
  * @param {{path: string, value: string}[]} values
5
5
  * @param {import('../../typings/context').ListrContext} param1
6
6
  */
7
- const updateTableValues = async (table, values, { mysqlConnection, task }) => {
8
- const [rows] = await mysqlConnection.query(`
7
+ const updateTableValues = async (table, values, { databaseConnection, task }) => {
8
+ const [rows] = await databaseConnection.query(`
9
9
  SELECT * FROM ${table}
10
10
  WHERE ${values.map((p) => `path = '${p.path}'`).join(' OR ')};
11
11
  `);
@@ -13,7 +13,7 @@ const updateTableValues = async (table, values, { mysqlConnection, task }) => {
13
13
  if (rows.filter(Boolean).length !== values.length) {
14
14
  const lostConfigs = values.filter((p) => !rows.some((row) => row.path === p.path));
15
15
  for (const config of lostConfigs) {
16
- await mysqlConnection.query(`
16
+ await databaseConnection.query(`
17
17
  INSERT INTO ${table}
18
18
  (scope, path, value)
19
19
  VALUES ('default', ?, ?);
@@ -22,7 +22,7 @@ const updateTableValues = async (table, values, { mysqlConnection, task }) => {
22
22
 
23
23
  const configsToUpdate = values.filter((p) => rows.some((row) => row.path === p.path));
24
24
  for (const config of configsToUpdate) {
25
- await mysqlConnection.query(`
25
+ await databaseConnection.query(`
26
26
  UPDATE ${table}
27
27
  SET value = ?
28
28
  WHERE path = ?;
@@ -50,7 +50,7 @@ const updateTableValues = async (table, values, { mysqlConnection, task }) => {
50
50
  });
51
51
 
52
52
  for (const config of configsToUpdate) {
53
- await mysqlConnection.query(`
53
+ await databaseConnection.query(`
54
54
  UPDATE ${table}
55
55
  SET value = ?
56
56
  WHERE path = ?;
@@ -63,11 +63,11 @@ const updateTableValues = async (table, values, { mysqlConnection, task }) => {
63
63
  * @param {String} tableName
64
64
  * @param {import('../../typings/context').ListrContext} param2
65
65
  */
66
- const isTableExists = async (database, tableName, { mysqlConnection }) => {
66
+ const isTableExists = async (database, tableName, { databaseConnection }) => {
67
67
  /**
68
68
  * @type {{ tableCount: number }[][]}
69
69
  */
70
- const [[{ tableCount }]] = await mysqlConnection.query(`
70
+ const [[{ tableCount }]] = await databaseConnection.query(`
71
71
  SELECT count(*) as tableCount
72
72
  FROM information_schema.TABLES
73
73
  WHERE (TABLE_SCHEMA = ?) AND (TABLE_NAME = ?);
@@ -0,0 +1,197 @@
1
+ /**
2
+ *
3
+ * @param {import('./types').DockerfileInstruction[]} instructions
4
+ */
5
+ const buildInstructions = (instructions) => {
6
+ /**
7
+ * @type {string[]}
8
+ */
9
+ const dockerFileInstructions = [];
10
+
11
+ for (const instruction of instructions) {
12
+ switch (instruction.type) {
13
+ case 'COPY':
14
+ case 'ADD': {
15
+ let addInstruction = instruction.type;
16
+
17
+ if (instruction.type === 'COPY' && instruction.from) {
18
+ addInstruction += ` --from=${instruction.from}`;
19
+ }
20
+
21
+ if (instruction.chown) {
22
+ addInstruction += ` --chown=${instruction.chown}`;
23
+ }
24
+
25
+ addInstruction += ` ${instruction.src.join(' ')}`;
26
+ addInstruction += ` ${instruction.dest}`;
27
+
28
+ dockerFileInstructions.push(addInstruction);
29
+ break;
30
+ }
31
+ case 'ARG': {
32
+ let argInstruction = instruction.type;
33
+
34
+ argInstruction += ` ${instruction.name}`;
35
+
36
+ if (instruction.defaultValue) {
37
+ argInstruction += `=${instruction.defaultValue}`;
38
+ }
39
+
40
+ dockerFileInstructions.push(argInstruction);
41
+ break;
42
+ }
43
+ case 'RUN':
44
+ case 'ENTRYPOINT':
45
+ case 'CMD': {
46
+ let cmdInstruction = instruction.type;
47
+
48
+ if (typeof instruction.command === 'string') {
49
+ cmdInstruction += ` ${instruction.command}`;
50
+ } else if (Array.isArray(instruction.command) && instruction.command.every((c) => typeof c === 'string')) {
51
+ cmdInstruction += ` ["${instruction.command.join('", "')}"]`;
52
+ } else {
53
+ throw new Error(`Unknown command type, it must be string or array of strings! ${instruction.command}`);
54
+ }
55
+
56
+ dockerFileInstructions.push(cmdInstruction);
57
+ break;
58
+ }
59
+
60
+ case 'COMMENT': {
61
+ const commentInstruction = `# ${instruction.comment}`;
62
+
63
+ dockerFileInstructions.push(commentInstruction);
64
+ break;
65
+ }
66
+ case 'ENV': {
67
+ let envInstruction = instruction.type;
68
+
69
+ envInstruction += ` ${instruction.name}="${instruction.value}"`;
70
+
71
+ dockerFileInstructions.push(envInstruction);
72
+ break;
73
+ }
74
+ case 'EXPOSE': {
75
+ let exposeInstruction = instruction.type;
76
+
77
+ if (instruction.protocol) {
78
+ exposeInstruction += ` ${instruction.port}/${instruction.protocol}`;
79
+ } else {
80
+ exposeInstruction += ` ${instruction.port}`;
81
+ }
82
+
83
+ dockerFileInstructions.push(exposeInstruction);
84
+ break;
85
+ }
86
+ case 'FROM': {
87
+ let fromInstruction = instruction.type;
88
+
89
+ if (instruction.platform) {
90
+ fromInstruction += ` --platform=${instruction.platform}`;
91
+ }
92
+
93
+ fromInstruction += ` ${instruction.image}:${instruction.tag || 'latest'}`;
94
+
95
+ if (instruction.name) {
96
+ fromInstruction += ` AS ${instruction.name}`;
97
+ }
98
+
99
+ dockerFileInstructions.push(fromInstruction);
100
+ break;
101
+ }
102
+ case 'HEALTHCHECK': {
103
+ let healthCheckInstruction = instruction.type;
104
+
105
+ if (instruction.interval) {
106
+ healthCheckInstruction += ` --interval=${instruction.interval}`;
107
+ }
108
+
109
+ if (instruction.retries) {
110
+ healthCheckInstruction += ` --retries=${instruction.retries}`;
111
+ }
112
+
113
+ if (instruction.startPeriod) {
114
+ healthCheckInstruction += ` --start-period=${instruction.startPeriod}`;
115
+ }
116
+
117
+ if (instruction.timeout) {
118
+ healthCheckInstruction += ` --timeout=${instruction.timeout}`;
119
+ }
120
+
121
+ healthCheckInstruction += ` ${instruction.command}`;
122
+
123
+ dockerFileInstructions.push(healthCheckInstruction);
124
+ break;
125
+ }
126
+ case 'LABEL': {
127
+ Object.entries(instruction.labels).forEach(([name, value]) => {
128
+ let labelInstruction = instruction.type;
129
+ labelInstruction += ` "${name}"="${value}"`;
130
+ dockerFileInstructions.push(labelInstruction);
131
+ });
132
+ break;
133
+ }
134
+ case 'ONBUILD': {
135
+ let onBuildInstruction = instruction.type;
136
+
137
+ onBuildInstruction += ` ${instruction.instruction}`;
138
+
139
+ dockerFileInstructions.push(onBuildInstruction);
140
+ break;
141
+ }
142
+ case 'SHELL': {
143
+ let shellInstruction = instruction.type;
144
+
145
+ shellInstruction += ` ["${instruction.exec.join('", "')}"]`;
146
+
147
+ dockerFileInstructions.push(shellInstruction);
148
+ break;
149
+ }
150
+ case 'STOPSIGNAL': {
151
+ let stopSignalInstruction = instruction.type;
152
+
153
+ stopSignalInstruction += ` ${instruction.signal}`;
154
+
155
+ dockerFileInstructions.push(stopSignalInstruction);
156
+ break;
157
+ }
158
+ case 'USER': {
159
+ let userInstruction = instruction.type;
160
+
161
+ userInstruction += ` ${instruction.user}`;
162
+
163
+ dockerFileInstructions.push(userInstruction);
164
+ break;
165
+ }
166
+ case 'VOLUME': {
167
+ let volumeInstruction = instruction.type;
168
+
169
+ if (typeof instruction.volume === 'string') {
170
+ volumeInstruction += ` ${instruction.volume}`;
171
+ } else if (Array.isArray(instruction.volume) && instruction.volume.every((c) => typeof c === 'string')) {
172
+ volumeInstruction += ` ["${instruction.volume.join('", "')}"]`;
173
+ } else {
174
+ throw new Error(`Unknown volume type, it must be string or array of strings! ${instruction.volume}`);
175
+ }
176
+
177
+ dockerFileInstructions.push(volumeInstruction);
178
+ break;
179
+ }
180
+ case 'WORKDIR': {
181
+ const workDirInstruction = `${instruction.type} ${instruction.workdir}`;
182
+
183
+ dockerFileInstructions.push(workDirInstruction);
184
+ break;
185
+ }
186
+ default: {
187
+ throw new Error(`I don't know instruction with type ${instruction.type}`);
188
+ }
189
+ }
190
+ }
191
+
192
+ return dockerFileInstructions.join('\n');
193
+ };
194
+
195
+ module.exports = {
196
+ buildInstructions
197
+ };