@scandipwa/magento-scripts 1.16.0 → 2.0.0-alpha.1

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 (225) 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 +98 -83
  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/versions/elasticsearch-6.8.js +23 -0
  36. package/lib/config/services/elasticsearch/versions/index.js +5 -0
  37. package/lib/config/templates/magentorc.template +5 -5
  38. package/lib/config/templates/mariadb.template.cnf +191 -0
  39. package/lib/config/templates/php-fpm.template.conf +3 -3
  40. package/lib/config/templates/php.template.ini +12 -6
  41. package/lib/config/templates/ssl-terminator.template.conf +1 -1
  42. package/lib/config/templates/vscode-launch.template.json +3 -1
  43. package/lib/config/versions/magento-2.3.0.js +10 -5
  44. package/lib/config/versions/magento-2.3.1.js +10 -5
  45. package/lib/config/versions/magento-2.3.2-p1.js +43 -0
  46. package/lib/config/versions/magento-2.3.2-p2.js +10 -5
  47. package/lib/config/versions/magento-2.3.2.js +10 -5
  48. package/lib/config/versions/magento-2.3.3-p1.js +10 -5
  49. package/lib/config/versions/magento-2.3.3.js +10 -5
  50. package/lib/config/versions/magento-2.3.4-p1.js +43 -0
  51. package/lib/config/versions/magento-2.3.4-p2.js +10 -5
  52. package/lib/config/versions/magento-2.3.4.js +10 -5
  53. package/lib/config/versions/magento-2.3.5-p1.js +8 -2
  54. package/lib/config/versions/magento-2.3.5-p2.js +8 -2
  55. package/lib/config/versions/magento-2.3.5.js +8 -2
  56. package/lib/config/versions/magento-2.3.6-p1.js +8 -2
  57. package/lib/config/versions/magento-2.3.6.js +8 -2
  58. package/lib/config/versions/magento-2.3.7-p1.js +8 -2
  59. package/lib/config/versions/magento-2.3.7-p2.js +8 -2
  60. package/lib/config/versions/magento-2.3.7-p3.js +8 -2
  61. package/lib/config/versions/magento-2.3.7.js +8 -2
  62. package/lib/config/versions/magento-2.4.0-p1.js +9 -3
  63. package/lib/config/versions/magento-2.4.0.js +9 -3
  64. package/lib/config/versions/magento-2.4.1-p1.js +6 -5
  65. package/lib/config/versions/magento-2.4.1.js +9 -2
  66. package/lib/config/versions/magento-2.4.2-p1.js +6 -5
  67. package/lib/config/versions/magento-2.4.2-p2.js +6 -6
  68. package/lib/config/versions/magento-2.4.2.js +6 -6
  69. package/lib/config/versions/magento-2.4.3-p1.js +7 -7
  70. package/lib/config/versions/magento-2.4.3-p2.js +7 -7
  71. package/lib/config/versions/magento-2.4.3.js +7 -7
  72. package/lib/config/versions/magento-2.4.4.js +9 -2
  73. package/lib/tasks/cleanup.js +3 -3
  74. package/lib/tasks/composer/index.js +14 -104
  75. package/lib/tasks/database/connect-to-database.js +117 -0
  76. package/lib/tasks/database/create-magento-database.js +18 -0
  77. package/lib/tasks/{mysql → database}/dump-theme-config.js +3 -3
  78. package/lib/tasks/{mysql → database}/fix-db.js +2 -2
  79. package/lib/tasks/{mysql/import-dump-to-mysql.js → database/import-dump-to-database.js} +65 -22
  80. package/lib/tasks/{mysql → database}/import-remote-db/index.js +0 -0
  81. package/lib/tasks/{mysql/import-remote-db/ssh/mysqldump-command.js → database/import-remote-db/ssh/database-dump-command.js} +2 -2
  82. package/lib/tasks/{mysql → database}/import-remote-db/ssh/index.js +0 -0
  83. package/lib/tasks/{mysql → database}/import-remote-db/ssh/readymage.js +4 -4
  84. package/lib/tasks/{mysql → database}/import-remote-db/ssh/regular-server.js +2 -2
  85. package/lib/tasks/{mysql → database}/index.js +2 -2
  86. package/lib/tasks/{mysql → database}/magento-tables.js +0 -0
  87. package/lib/tasks/{mysql → database}/restore-theme-config.js +4 -4
  88. package/lib/tasks/docker/api.d.ts +71 -0
  89. package/lib/tasks/docker/api.js +30 -0
  90. package/lib/tasks/docker/containers/container-api.d.ts +128 -0
  91. package/lib/tasks/docker/containers/container-api.js +153 -0
  92. package/lib/tasks/docker/containers/index.js +19 -0
  93. package/lib/tasks/docker/containers/tasks.js +215 -0
  94. package/lib/tasks/docker/convert-legacy-volumes.js +15 -10
  95. package/lib/tasks/docker/convert-mysql-to-mariadb.js +284 -0
  96. package/lib/tasks/docker/image/image-api.d.ts +34 -0
  97. package/lib/tasks/docker/image/image-api.js +49 -0
  98. package/lib/tasks/docker/image/index.js +5 -0
  99. package/lib/tasks/docker/index.js +1 -13
  100. package/lib/tasks/docker/network/index.js +7 -0
  101. package/lib/tasks/docker/network/network-api.d.ts +103 -0
  102. package/lib/tasks/docker/network/network-api.js +99 -0
  103. package/lib/tasks/docker/{network.js → network/tasks.js} +17 -10
  104. package/lib/tasks/docker/project-image-builder.js +167 -0
  105. package/lib/tasks/docker/volume/index.js +8 -0
  106. package/lib/tasks/docker/{volumes.js → volume/tasks.js} +5 -19
  107. package/lib/tasks/docker/volume/volume-api.d.ts +39 -0
  108. package/lib/tasks/docker/volume/volume-api.js +66 -0
  109. package/lib/tasks/execute/index.js +5 -2
  110. package/lib/tasks/file-system/create-mariadb-config.js +23 -0
  111. package/lib/tasks/file-system/create-nginx-config.js +2 -3
  112. package/lib/tasks/file-system/create-php-config.js +20 -5
  113. package/lib/tasks/file-system/create-php-fpm-config.js +8 -4
  114. package/lib/tasks/file-system/create-phpstorm-config/exclude-folder-config.js +41 -29
  115. package/lib/tasks/file-system/create-phpstorm-config/index.js +2 -0
  116. package/lib/tasks/file-system/create-phpstorm-config/keys.js +15 -1
  117. package/lib/tasks/file-system/create-phpstorm-config/php-config/index.js +4 -1
  118. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-config.js +3 -3
  119. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-interpreters-config.js +81 -0
  120. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/index.js +42 -0
  121. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/php-docker-settings-config.js +9 -0
  122. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/setup-php-docker-container-settings-config.js +66 -0
  123. package/lib/tasks/file-system/create-phpstorm-config/setup-xml-structure.js +11 -9
  124. package/lib/tasks/file-system/create-phpstorm-config/stylelint-config.js +2 -1
  125. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/composer-settings-config.js +15 -30
  126. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/index.js +24 -5
  127. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/mess-detector-project-configuration-config.js +50 -0
  128. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-code-sniffer-project-configuration-config.js +50 -0
  129. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-cs-fixer-project-configuration-config.js +50 -0
  130. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-debug-general-config.js +15 -15
  131. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-server-config.js +29 -3
  132. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-stan-project-configuration-config.js.js +50 -0
  133. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-workspace-project-configuration-config.js +42 -0
  134. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/psalm-project-configuration-config.js.js +50 -0
  135. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/workspace-config.js +0 -2
  136. package/lib/tasks/file-system/create-ssl-terminator-config.js +4 -2
  137. package/lib/tasks/file-system/create-vscode-config.js +57 -42
  138. package/lib/tasks/file-system/index.js +5 -2
  139. package/lib/tasks/import-dump.js +6 -6
  140. package/lib/tasks/link.js +5 -4
  141. package/lib/tasks/magento/install-magento-project.js +31 -63
  142. package/lib/tasks/magento/setup-magento/adjust-full-page-cache.js +4 -4
  143. package/lib/tasks/magento/setup-magento/configure-elasticsearch.js +7 -3
  144. package/lib/tasks/magento/setup-magento/create-admin.js +5 -6
  145. package/lib/tasks/magento/setup-magento/delete-admin-users.js +2 -2
  146. package/lib/tasks/magento/setup-magento/delete-customers.js +4 -4
  147. package/lib/tasks/magento/setup-magento/delete-orders.js +4 -4
  148. package/lib/tasks/magento/setup-magento/disable-2fa.js +3 -5
  149. package/lib/tasks/magento/setup-magento/disable-maintenance-mode.js +3 -4
  150. package/lib/tasks/magento/setup-magento/increase-admin-session-lifetime.js +2 -2
  151. package/lib/tasks/magento/setup-magento/index.js +3 -3
  152. package/lib/tasks/magento/setup-magento/install-magento.js +47 -40
  153. package/lib/tasks/magento/setup-magento/migrate-database.js +7 -14
  154. package/lib/tasks/magento/setup-magento/set-base-url.js +2 -2
  155. package/lib/tasks/magento/setup-magento/set-deployment-mode.js +4 -4
  156. package/lib/tasks/magento/setup-magento/set-url-rewrite.js +2 -2
  157. package/lib/tasks/magento/setup-magento/varnish-config.js +11 -9
  158. package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +128 -3
  159. package/lib/tasks/php/php-container.js +108 -0
  160. package/lib/tasks/php/update-env-php.js +39 -21
  161. package/lib/tasks/php/update-env.php +66 -61
  162. package/lib/tasks/php/working_health_check.php +85 -0
  163. package/lib/tasks/requirements/{composer.js → composer-credentials.js} +3 -1
  164. package/lib/tasks/requirements/docker/index.js +15 -12
  165. package/lib/tasks/requirements/docker/performance.js +54 -0
  166. package/lib/tasks/requirements/docker/version.js +8 -8
  167. package/lib/tasks/requirements/index.js +5 -8
  168. package/lib/tasks/requirements/php-version.js +8 -116
  169. package/lib/tasks/requirements/platform.js +12 -25
  170. package/lib/tasks/start.js +24 -51
  171. package/lib/tasks/status/index.js +8 -12
  172. package/lib/tasks/stop.js +0 -2
  173. package/lib/tasks/theme/install-theme.js +1 -1
  174. package/lib/tasks/theme/link-theme.js +2 -2
  175. package/lib/tasks/theme/symlink-theme.js +2 -3
  176. package/lib/util/config-file-validator.js +27 -13
  177. package/lib/util/config-php-json.js +13 -4
  178. package/lib/util/database.js +7 -7
  179. package/lib/util/dockerfile-builder/build-instructions.js +197 -0
  180. package/lib/util/dockerfile-builder/index.js +276 -0
  181. package/lib/util/dockerfile-builder/types.d.ts +123 -0
  182. package/lib/util/env-php-json.js +10 -6
  183. package/lib/util/exec-async-command.js +3 -9
  184. package/lib/util/macos-version.js +20 -0
  185. package/lib/util/magento-task.js +3 -4
  186. package/lib/util/nginx-logs-parser.js +122 -0
  187. package/lib/util/php-task.js +3 -6
  188. package/lib/util/run-composer.js +6 -14
  189. package/lib/util/run-container-image.js +17 -0
  190. package/lib/util/run-magento.js +6 -14
  191. package/lib/util/run-php.js +6 -17
  192. package/package.json +9 -9
  193. package/typings/context.d.ts +7 -13
  194. package/typings/index.d.ts +67 -85
  195. package/yarn-error.log +9660 -0
  196. package/lib/config/composer.js +0 -11
  197. package/lib/config/php/extensions/libsodium.js +0 -36
  198. package/lib/config/php/releases/php-7.2.js +0 -25
  199. package/lib/config/php/releases/php-7.3.js +0 -25
  200. package/lib/config/php/releases/php-7.4.js +0 -23
  201. package/lib/config/php/releases/php-8.1.js +0 -25
  202. package/lib/config/phpbrew.js +0 -12
  203. package/lib/tasks/composer/install-prestissimo.js +0 -103
  204. package/lib/tasks/docker/containers.js +0 -231
  205. package/lib/tasks/mysql/connect-to-mysql.js +0 -114
  206. package/lib/tasks/mysql/create-magento-database.js +0 -18
  207. package/lib/tasks/php/bundled-extensions.js +0 -27
  208. package/lib/tasks/php/compile-options.js +0 -56
  209. package/lib/tasks/php/compile.js +0 -55
  210. package/lib/tasks/php/configure.js +0 -89
  211. package/lib/tasks/php/extensions/disable.js +0 -49
  212. package/lib/tasks/php/extensions/enable.js +0 -52
  213. package/lib/tasks/php/extensions/index.js +0 -80
  214. package/lib/tasks/php/extensions/install.js +0 -54
  215. package/lib/tasks/php/index.js +0 -79
  216. package/lib/tasks/php/install-sodium.js +0 -93
  217. package/lib/tasks/php/update-phpbrew.js +0 -45
  218. package/lib/tasks/php/validate-php.js +0 -67
  219. package/lib/tasks/php-fpm/get-process-id.js +0 -14
  220. package/lib/tasks/php-fpm/index.js +0 -4
  221. package/lib/tasks/php-fpm/start-php-fpm.js +0 -49
  222. package/lib/tasks/php-fpm/stop-php-fpm.js +0 -48
  223. package/lib/tasks/requirements/phpbrew/index.js +0 -61
  224. package/lib/tasks/requirements/phpbrew/install.js +0 -159
  225. package/lib/tasks/requirements/phpbrew/version.js +0 -28
@@ -10,8 +10,8 @@ const setUrlRewrite = require('./set-url-rewrite');
10
10
  const increaseAdminSessionLifetime = require('./increase-admin-session-lifetime');
11
11
  const magentoTask = require('../../../util/magento-task');
12
12
  const urnHighlighter = require('./urn-highlighter');
13
- const waitingForVarnish = require('./waiting-for-varnish');
14
13
  const adjustFullPageCache = require('./adjust-full-page-cache');
14
+ const updateEnvPHP = require('../../php/update-env-php');
15
15
 
16
16
  /**
17
17
  * @param {Object} [options]
@@ -33,6 +33,7 @@ const setupMagento = (options = {}) => ({
33
33
  return task.newListr([
34
34
  flushRedisConfig(),
35
35
  waitingForRedis(),
36
+ updateEnvPHP(),
36
37
  migrateDatabase(),
37
38
  {
38
39
  title: 'Configuring Magento settings',
@@ -50,8 +51,7 @@ const setupMagento = (options = {}) => ({
50
51
  disable2fa(),
51
52
  urnHighlighter(),
52
53
  adjustFullPageCache(),
53
- magentoTask('cache:flush'),
54
- waitingForVarnish()
54
+ magentoTask('cache:flush')
55
55
  ], {
56
56
  concurrent: false,
57
57
  exitOnError: true,
@@ -24,50 +24,58 @@ const installMagento = ({ isDbEmpty = false } = {}) => ({
24
24
  magentoConfiguration
25
25
  },
26
26
  ports,
27
- mysqlConnection
27
+ databaseConnection
28
28
  } = ctx;
29
29
 
30
- const response = await mysqlConnection.query(
31
- 'select * from admin_user where username=\'admin\';'
30
+ const isLinux = ctx.platform === 'linux';
31
+ const isNativeLinux = isLinux && !ctx.isWsl;
32
+ const hostMachine = isNativeLinux ? '127.0.0.1' : 'host.docker.internal';
33
+
34
+ const [tableResponse] = await databaseConnection.query(
35
+ 'SELECT * FROM information_schema.tables WHERE table_schema = \'magento\' AND table_name = \'admin_user\' LIMIT 1;'
32
36
  );
33
37
 
34
- const usersWithUsernameAdmin = response && response.length > 0 && response[0];
35
-
36
- if (usersWithUsernameAdmin && usersWithUsernameAdmin.length > 0) {
37
- const confirmDeleteAdminUsers = await task.prompt({
38
- type: 'Select',
39
- message: `In order to install Magento in database you will need to delete admin user with username ${logger.style.command('admin')}`,
40
- choices: [
41
- {
42
- name: 'delete-all',
43
- message: `Delete all admin users (${logger.style.code('Recommended')})`
44
- },
45
- {
46
- name: 'delete-only-admin',
47
- message: `Delete only admin user with ${logger.style.command('admin')} username`
48
- }
49
- ]
50
- });
38
+ if (tableResponse.length > 0) {
39
+ const response = await databaseConnection.query(
40
+ 'select * from admin_user where username=\'admin\';'
41
+ );
42
+
43
+ const usersWithUsernameAdmin = response && response.length > 0 && response[0];
44
+
45
+ if (usersWithUsernameAdmin && usersWithUsernameAdmin.length > 0) {
46
+ const confirmDeleteAdminUsers = await task.prompt({
47
+ type: 'Select',
48
+ message: `In order to install Magento in database you will need to delete admin user with username ${logger.style.command('admin')}`,
49
+ choices: [
50
+ {
51
+ name: 'delete-all',
52
+ message: `Delete all admin users (${logger.style.code('Recommended')})`
53
+ },
54
+ {
55
+ name: 'delete-only-admin',
56
+ message: `Delete only admin user with ${logger.style.command('admin')} username`
57
+ }
58
+ ]
59
+ });
51
60
 
52
- await mysqlConnection.query('SET FOREIGN_KEY_CHECKS = 0;');
61
+ await databaseConnection.query('SET FOREIGN_KEY_CHECKS = 0;');
53
62
 
54
- if (confirmDeleteAdminUsers === 'delete-all') {
55
- await mysqlConnection.query(`
63
+ if (confirmDeleteAdminUsers === 'delete-all') {
64
+ await databaseConnection.query(`
56
65
  TRUNCATE TABLE admin_user;
57
66
  `);
58
- } else {
59
- await mysqlConnection.query(`
67
+ } else {
68
+ await databaseConnection.query(`
60
69
  DELETE FROM admin_user WHERE username='admin';
61
70
  `);
62
- }
71
+ }
63
72
 
64
- await mysqlConnection.query('SET FOREIGN_KEY_CHECKS = 1;');
73
+ await databaseConnection.query('SET FOREIGN_KEY_CHECKS = 1;');
74
+ }
65
75
  }
66
76
 
67
- const { mysql: { env } } = docker.getContainers(ports);
68
- const envPhpData = await envPhpToJson(process.cwd(), {
69
- magentoVersion: ctx.magentoVersion
70
- });
77
+ const { mariadb: { env } } = docker.getContainers(ports);
78
+ const envPhpData = await envPhpToJson(ctx);
71
79
 
72
80
  const envPhpHaveEncryptionKey = envPhpData && envPhpData.crypt && envPhpData.crypt.key && envPhpData.crypt.key;
73
81
 
@@ -89,7 +97,7 @@ const installMagento = ({ isDbEmpty = false } = {}) => ({
89
97
 
90
98
  const elasticsearchConfiguration = ` \
91
99
  --search-engine='elasticsearch7' \
92
- --elasticsearch-host='127.0.0.1' \
100
+ --elasticsearch-host='${ hostMachine }' \
93
101
  --elasticsearch-port='${ ports.elasticsearch }'`;
94
102
 
95
103
  /**
@@ -108,25 +116,24 @@ const installMagento = ({ isDbEmpty = false } = {}) => ({
108
116
  ${ !isMagento23 ? elasticsearchConfiguration : '' } \
109
117
  ${encryptionKeyOption || ''} \
110
118
  --session-save=redis \
111
- --session-save-redis-host='127.0.0.1' \
119
+ --session-save-redis-host='${ hostMachine }' \
112
120
  --session-save-redis-port='${ ports.redis }' \
113
121
  --session-save-redis-log-level='3' \
114
122
  --session-save-redis-max-concurrency='30' \
115
123
  --session-save-redis-db='1' \
116
124
  --session-save-redis-disable-locking='1' \
117
125
  --cache-backend='redis' \
118
- --cache-backend-redis-server='127.0.0.1' \
126
+ --cache-backend-redis-server='${ hostMachine }' \
119
127
  --cache-backend-redis-port='${ ports.redis }' \
120
128
  --cache-backend-redis-db='0't \
121
- --db-host='127.0.0.1:${ ports.mysql }' \
122
- --db-name='${ env.MYSQL_DATABASE }' \
123
- --db-user='${ env.MYSQL_USER }' \
124
- --db-password='${ env.MYSQL_PASSWORD }' \
129
+ --db-host='${ hostMachine }:${ ports.mariadb }' \
130
+ --db-name='${ env.MARIADB_DATABASE }' \
131
+ --db-user='${ env.MARIADB_USER }' \
132
+ --db-password='${ env.MARIADB_PASSWORD }' \
125
133
  --backend-frontname='${ magentoConfiguration.adminuri }' \
126
134
  --no-interaction`;
127
135
 
128
- await runMagentoCommand(command, {
129
- magentoVersion,
136
+ await runMagentoCommand(ctx, command, {
130
137
  throwNonZeroCode: true,
131
138
  callback: !ctx.verbose ? undefined : (t) => {
132
139
  task.output = t;
@@ -8,6 +8,7 @@ const upgradeMagento = require('./upgrade-magento');
8
8
  const varnishConfigSetup = require('./varnish-config');
9
9
  const pathExists = require('../../../util/path-exists');
10
10
  const updateEnvPHP = require('../../php/update-env-php');
11
+ const UnknownError = require('../../../errors/unknown-error');
11
12
 
12
13
  /**
13
14
  * @param {Object} [options]
@@ -17,12 +18,9 @@ const updateEnvPHP = require('../../php/update-env-php');
17
18
  const migrateDatabase = (options = {}) => ({
18
19
  title: 'Migrating database',
19
20
  task: async (ctx, task) => {
20
- const {
21
- magentoVersion,
22
- mysqlConnection
23
- } = ctx;
21
+ const { databaseConnection } = ctx;
24
22
 
25
- const [[{ tableCount }]] = await mysqlConnection.query(`
23
+ const [[{ tableCount }]] = await databaseConnection.query(`
26
24
  SELECT count(*) AS tableCount
27
25
  FROM INFORMATION_SCHEMA.TABLES
28
26
  WHERE TABLE_SCHEMA = 'magento';
@@ -35,9 +33,9 @@ const migrateDatabase = (options = {}) => ({
35
33
  ) {
36
34
  if (options.onlyInstallMagento) {
37
35
  ctx.isSetupUpgradeNeeded = false;
38
- return task.newListr(
36
+ return task.newListr([
39
37
  installMagento({ isDbEmpty: true })
40
- );
38
+ ]);
41
39
  }
42
40
 
43
41
  return task.newListr([
@@ -57,8 +55,7 @@ const migrateDatabase = (options = {}) => ({
57
55
  });
58
56
  }
59
57
 
60
- const { code } = await runMagentoCommand('setup:db:status', {
61
- magentoVersion,
58
+ const { code, result } = await runMagentoCommand(ctx, 'setup:db:status', {
62
59
  throwNonZeroCode: false
63
60
  });
64
61
 
@@ -67,7 +64,6 @@ const migrateDatabase = (options = {}) => ({
67
64
  ctx.isSetupUpgradeNeeded = false;
68
65
  // no setup is needed, but still to be sure configure ES
69
66
  return task.newListr([
70
- updateEnvPHP(),
71
67
  varnishConfigSetup(),
72
68
  configureElasticsearch()
73
69
  ], {
@@ -107,7 +103,6 @@ const migrateDatabase = (options = {}) => ({
107
103
  }
108
104
  case 2: {
109
105
  return task.newListr([
110
- updateEnvPHP(),
111
106
  varnishConfigSetup(),
112
107
  configureElasticsearch(),
113
108
  upgradeMagento()
@@ -121,9 +116,7 @@ const migrateDatabase = (options = {}) => ({
121
116
  });
122
117
  }
123
118
  default: {
124
- // TODO: handle these statuses ?
125
- task.title = 'Migrating database failed: manual action is required!';
126
- break;
119
+ throw new UnknownError(`Migrating database failed: manual action is required!\n\n${result}`);
127
120
  }
128
121
  }
129
122
  },
@@ -14,7 +14,7 @@ module.exports = () => ({
14
14
  ssl
15
15
  }
16
16
  },
17
- mysqlConnection
17
+ databaseConnection
18
18
  } = ctx;
19
19
  const isNgrok = host.endsWith('ngrok.io');
20
20
  const enableSecureFrontend = ssl.enabled ? '1' : '0';
@@ -29,6 +29,6 @@ module.exports = () => ({
29
29
  { path: 'web/secure/use_in_frontend', value: enableSecureFrontend },
30
30
  { path: 'web/secure/use_in_adminhtml', value: enableSecureFrontend },
31
31
  { path: 'web/cookie/cookie_domain', value: null }
32
- ], { mysqlConnection, task });
32
+ ], { databaseConnection, task });
33
33
  }
34
34
  });
@@ -6,10 +6,10 @@ const runMagentoCommand = require('../../../util/run-magento');
6
6
  */
7
7
  module.exports = () => ({
8
8
  title: 'Switching Magento mode',
9
- task: async ({ magentoVersion, config: { magentoConfiguration: { mode } } }, task) => {
10
- const { result } = await runMagentoCommand('deploy:mode:show', {
11
- throwNonZeroCode: false,
12
- magentoVersion
9
+ task: async (ctx, task) => {
10
+ const { config: { magentoConfiguration: { mode } } } = ctx;
11
+ const { result } = await runMagentoCommand(ctx, 'deploy:mode:show', {
12
+ throwNonZeroCode: false
13
13
  });
14
14
 
15
15
  if (result.includes(mode)) {
@@ -5,13 +5,13 @@ const { updateTableValues } = require('../../../util/database');
5
5
  */
6
6
  const setUrlRewrite = () => ({
7
7
  title: 'Setting up url-rewrites',
8
- task: async ({ mysqlConnection }, task) => {
8
+ task: async ({ databaseConnection }, task) => {
9
9
  await updateTableValues('core_config_data', [
10
10
  {
11
11
  path: 'web/seo/use_rewrites',
12
12
  value: '1'
13
13
  }
14
- ], { mysqlConnection, task });
14
+ ], { databaseConnection, task });
15
15
  }
16
16
  });
17
17
 
@@ -6,7 +6,7 @@ const getIsWsl = require('../../../util/is-wsl');
6
6
  * @returns {import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
7
7
  */
8
8
  const varnishConfigSetup = () => ({
9
- title: 'Varnish setup',
9
+ title: 'Varnish Database setup',
10
10
  task: async (ctx, task) => {
11
11
  const {
12
12
  config: {
@@ -18,18 +18,20 @@ const varnishConfigSetup = () => ({
18
18
  }
19
19
  }
20
20
  },
21
- mysqlConnection,
22
- ports
21
+ databaseConnection,
22
+ ports,
23
+ debug
23
24
  } = ctx;
24
25
 
25
26
  const isLinux = os.platform() === 'linux';
26
27
  const isWsl = await getIsWsl();
28
+ const isNativeLinux = isLinux && !isWsl;
27
29
 
28
- if (varnishEnabled) {
30
+ if (!debug && varnishEnabled) {
29
31
  await updateTableValues('core_config_data', [
30
32
  {
31
33
  path: 'system/full_page_cache/varnish/backend_host',
32
- value: 'localhost'
34
+ value: !isNativeLinux ? 'host.docker.internal' : 'localhost'
33
35
  },
34
36
  {
35
37
  path: 'system/full_page_cache/varnish/backend_port',
@@ -37,16 +39,16 @@ const varnishConfigSetup = () => ({
37
39
  },
38
40
  {
39
41
  path: 'system/full_page_cache/varnish/access_list',
40
- value: (!isLinux || isWsl) ? 'host.docker.internal,localhost' : 'localhost'
42
+ value: !isNativeLinux ? 'host.docker.internal,localhost' : 'localhost'
41
43
  },
42
44
  {
43
45
  path: 'system/full_page_cache/caching_application',
44
46
  value: '2'
45
47
  }
46
- ], { mysqlConnection, task });
48
+ ], { databaseConnection, task });
47
49
  } else {
48
50
  // delete varnish configuration if exists
49
- await mysqlConnection.query(`
51
+ await databaseConnection.query(`
50
52
  DELETE FROM core_config_data WHERE path LIKE '%varnish%';
51
53
  `);
52
54
 
@@ -57,7 +59,7 @@ const varnishConfigSetup = () => ({
57
59
  path: 'system/full_page_cache/caching_application',
58
60
  value: '0'
59
61
  }
60
- ], { mysqlConnection, task });
62
+ ], { databaseConnection, task });
61
63
  }
62
64
  },
63
65
  options: {
@@ -1,14 +1,48 @@
1
+ const logger = require('@scandipwa/scandipwa-dev-utils/logger');
2
+ const semver = require('semver');
3
+ const fs = require('fs');
4
+ const path = require('path');
1
5
  const { request } = require('smol-request');
2
6
  const KnownError = require('../../../errors/known-error');
7
+ const { execAsyncSpawn } = require('../../../util/exec-async-command');
8
+ const { NginxParser } = require('../../../util/nginx-logs-parser');
3
9
  const sleep = require('../../../util/sleep');
4
10
 
11
+ const pathToWorkingHealthCheckPhp = path.join(__dirname, '..', '..', 'php', 'working_health_check.php');
12
+ const pathToProjectsHealthCheckPhp = path.join(process.cwd(), 'pub', 'health_check.php');
13
+ const pathToHealthCheckBackupPhp = path.join(process.cwd(), 'pub', 'health_check-super-backup-file.php');
14
+
15
+ /**
16
+ * @param {import('../../../../typings/context').ListrContext} ctx
17
+ */
18
+ const getIsHealthCheckRequestBroken = async (ctx) => {
19
+ const { nginx } = ctx.config.docker.getContainers(ctx.ports);
20
+
21
+ const nginxLogs = await execAsyncSpawn(`docker logs ${nginx.name}`);
22
+
23
+ const healthCheckRequests = nginxLogs
24
+ .split('\n')
25
+ .filter((line) => line.includes('"GET /health_check.php HTTP/1.1"'));
26
+
27
+ // eslint-disable-next-line max-len
28
+ const parser = new NginxParser('$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"');
29
+
30
+ const parsedRequests = healthCheckRequests.map((line) => parser.parseLine(line));
31
+
32
+ return parsedRequests.every((parsedRequest) => parsedRequest.status !== '200');
33
+ };
34
+
5
35
  /**
6
36
  * @returns {import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
7
37
  */
8
38
  const waitingForVarnish = () => ({
9
39
  title: 'Waiting for Varnish to return code 200',
10
- skip: (ctx) => !ctx.config.overridenConfiguration.configuration.varnish.enabled,
11
- task: async (ctx) => {
40
+ skip: (ctx) => ctx.debug || !ctx.config.overridenConfiguration.configuration.varnish.enabled,
41
+ task: async (ctx, task) => {
42
+ const pureMagentoVersion = ctx.magentoVersion.match(/^([0-9]+\.[0-9]+\.[0-9]+)/)[1];
43
+
44
+ const isMagento23 = semver.satisfies(pureMagentoVersion, '<2.4');
45
+
12
46
  let tries = 0;
13
47
  while (tries < 10) {
14
48
  try {
@@ -28,6 +62,94 @@ const waitingForVarnish = () => ({
28
62
  }
29
63
  }
30
64
 
65
+ if (tries === 10 && isMagento23) {
66
+ const isHealthCheckRequestBroken = await getIsHealthCheckRequestBroken(ctx);
67
+ if (isHealthCheckRequestBroken) {
68
+ const confirm = await task.prompt({
69
+ type: 'Select',
70
+ message: `We detected that your Magento instance is experiencing problems with Varnish server.
71
+ Health Check request is returning status 500.
72
+
73
+ Do you want to try resolving this issue by replacing ${logger.style.file('./pub/health_check.php')} file content with content from newer Magento version (2.4.4)?`,
74
+ choices: [
75
+ {
76
+ name: 'yes',
77
+ message: 'Okay, let\'s try that'
78
+ },
79
+ {
80
+ name: 'no',
81
+ message: 'I will try to fix this myself, thanks for the info!'
82
+ }
83
+ ]
84
+ });
85
+
86
+ if (confirm === 'yes') {
87
+ await fs.promises.writeFile(
88
+ pathToHealthCheckBackupPhp,
89
+ await fs.promises.readFile(pathToProjectsHealthCheckPhp, 'utf-8'),
90
+ 'utf-8'
91
+ );
92
+
93
+ task.output = `Backup made! Available at ${logger.style.file(pathToHealthCheckBackupPhp)}`;
94
+
95
+ await fs.promises.writeFile(
96
+ pathToProjectsHealthCheckPhp,
97
+ await fs.promises.readFile(pathToWorkingHealthCheckPhp, 'utf-8'),
98
+ 'utf-8'
99
+ );
100
+
101
+ task.output = `${logger.style.file('./pub/health_check.php')} content is replaced, waiting for nginx logs...`;
102
+
103
+ let connectionFixed = false;
104
+
105
+ for (let i = 0; i < 10; i++) {
106
+ try {
107
+ const response = await request(`http://localhost:${ctx.ports.sslTerminator}/`, {
108
+ responseType: 'headers'
109
+ });
110
+
111
+ if (response.status !== 200) {
112
+ await sleep(2000);
113
+ } else {
114
+ connectionFixed = true;
115
+ break;
116
+ }
117
+ } catch (e) {
118
+ await sleep(200);
119
+ }
120
+ }
121
+
122
+ if (connectionFixed) {
123
+ task.output = 'Connection looks good!';
124
+ const secondConfirm = await task.prompt({
125
+ type: 'Select',
126
+ message: `Okay, looks like it helped!
127
+ Do you want to keep backed up ${logger.style.file('health_check.php')} file?`,
128
+ choices: [
129
+ {
130
+ name: 'no',
131
+ message: 'I don\'t think I will need it anymore, thanks'
132
+ },
133
+ {
134
+ name: 'yes',
135
+ message: 'I will keep it, maybe it will be useful (X to doubt)'
136
+ }
137
+ ]
138
+ });
139
+
140
+ if (secondConfirm === 'no') {
141
+ await fs.promises.rm(pathToHealthCheckBackupPhp);
142
+ }
143
+ }
144
+
145
+ return;
146
+ }
147
+
148
+ task.skip('User choose to fix issue himself');
149
+ return;
150
+ }
151
+ }
152
+
31
153
  if (tries === 10) {
32
154
  throw new KnownError(`After 20 seconds website is still responding with non-200 code, which might indicate issue with setup.
33
155
  Or Varnish is still loading...
@@ -35,7 +157,10 @@ Or Varnish is still loading...
35
157
  Please check the logs!`);
36
158
  }
37
159
  },
38
- exitOnError: false
160
+ exitOnError: false,
161
+ options: {
162
+ bottomBar: 10
163
+ }
39
164
  });
40
165
 
41
166
  module.exports = waitingForVarnish;
@@ -0,0 +1,108 @@
1
+ /* eslint-disable no-use-before-define */
2
+ const { deepmerge } = require('../../util/deepmerge');
3
+ const { containerApi } = require('../docker/containers');
4
+
5
+ /**
6
+ * @param {import('../../../typings/context').ListrContext} ctx
7
+ * @param {import('../../util/exec-async-command').ExecAsyncSpawnOptions<false> & { useXDebugContainer?: boolean }} [options]
8
+ * @param {string} command
9
+ */
10
+ const runPHPContainerCommand = async (ctx, command, options = {}) => {
11
+ const { php } = ctx.config.docker.getContainers(ctx.ports);
12
+
13
+ const containers = await containerApi.ls({ formatToJSON: true, all: true });
14
+
15
+ if (containers.some((c) => c.Names === php.name)) {
16
+ return execPHPContainerCommand(ctx, command, options);
17
+ }
18
+
19
+ return containerApi.run(
20
+ deepmerge(
21
+ php,
22
+ {
23
+ detach: false,
24
+ rm: true
25
+ },
26
+ options.useXDebugContainer
27
+ ? {
28
+ image: `${ php.image }.xdebug`
29
+ }
30
+ : {},
31
+ {
32
+ command
33
+ },
34
+ ),
35
+ options
36
+ );
37
+ };
38
+
39
+ /**
40
+ * @param {string} command
41
+ * @param {import('../../util/exec-async-command').ExecAsyncSpawnOptions<false> & { useXDebugContainer?: boolean }} [options]
42
+ * @returns {import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
43
+ */
44
+ const runPHPContainerCommandTask = (command, options = {}) => ({
45
+ title: `Running command "${command}"`,
46
+ task: (ctx, task) => runPHPContainerCommand(ctx, command, {
47
+ callback: !ctx.verbose ? undefined : (t) => {
48
+ task.output = t;
49
+ },
50
+ ...options
51
+ }),
52
+ option: {
53
+ bottomBar: 10
54
+ }
55
+ });
56
+
57
+ /**
58
+ *
59
+ * @param {import('../../../typings/context').ListrContext} ctx
60
+ * @param {import('../../util/exec-async-command').ExecAsyncSpawnOptions<false> & { useXDebugContainer?: boolean }} [options]
61
+ * @param {string} command
62
+ */
63
+ const execPHPContainerCommand = async (ctx, command, options = {}) => {
64
+ const { php } = ctx.config.docker.getContainers(ctx.ports);
65
+
66
+ const containers = await containerApi.ls({ formatToJSON: true, all: true });
67
+
68
+ if (!containers.some((c) => c.Names === php.name)) {
69
+ return runPHPContainerCommand(ctx, command, options);
70
+ }
71
+
72
+ return containerApi.exec(
73
+ command,
74
+ php.name,
75
+ deepmerge(
76
+ php,
77
+ options.env ? {
78
+ env: options.env
79
+ } : {}
80
+ ),
81
+ options
82
+ );
83
+ };
84
+
85
+ /**
86
+ * @param {string} command
87
+ * @param {import('../../util/exec-async-command').ExecAsyncSpawnOptions<false> & { useXDebugContainer?: boolean, title?: string }} [options]
88
+ * @returns {import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
89
+ */
90
+ const execPHPContainerCommandTask = (command, options = {}) => ({
91
+ title: typeof options.title === 'string' && options.title === '' ? undefined : options.title || `Running command "${command}"`,
92
+ task: (ctx, task) => execPHPContainerCommand(ctx, command, {
93
+ callback: !ctx.verbose ? undefined : (t) => {
94
+ task.output = t;
95
+ },
96
+ ...options
97
+ }),
98
+ option: {
99
+ bottomBar: 10
100
+ }
101
+ });
102
+
103
+ module.exports = {
104
+ runPHPContainerCommand,
105
+ runPHPContainerCommandTask,
106
+ execPHPContainerCommand,
107
+ execPHPContainerCommandTask
108
+ };