@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
@@ -0,0 +1,167 @@
1
+ const { DockerFileBuilder } = require('../../util/dockerfile-builder');
2
+ const semver = require('semver');
3
+ const { execAsyncSpawn } = require('../../util/exec-async-command');
4
+ const KnownError = require('../../errors/known-error');
5
+ const { runContainerImage } = require('../../util/run-container-image');
6
+
7
+ /**
8
+ * Get enabled extensions list with versions
9
+ * @param {string} imageWithTag
10
+ * @returns {Promise<{[key: string]: string}}>}
11
+ */
12
+ const getEnabledExtensionsFromImage = async (imageWithTag) => {
13
+ const output = await runContainerImage(
14
+ imageWithTag,
15
+ // eslint-disable-next-line quotes
16
+ `php -r 'foreach (get_loaded_extensions() as $extension) echo "$extension:" . phpversion($extension) . "\n";'`
17
+ );
18
+
19
+ return output
20
+ .split('\n')
21
+ .map((m) => {
22
+ // eslint-disable-next-line no-unused-vars
23
+ const [_, moduleName, moduleVersion] = m.match(/(.+):(.+)/i);
24
+
25
+ return [moduleName, moduleVersion];
26
+ })
27
+ .reduce((acc, [name, version]) => ({ ...acc, [name]: version }), {});
28
+ };
29
+
30
+ const addExtensionToBuilder = (builder, ctx) => ([extensionName, extensionInstructions]) => {
31
+ const { command, ...extensionInstructionsWithoutCommand } = extensionInstructions;
32
+ let runCommand = '';
33
+ if (typeof command === 'string') {
34
+ runCommand += ` ${command}`;
35
+ } else if (typeof command === 'function') {
36
+ runCommand += ` ${command({ ...extensionInstructionsWithoutCommand, ctx })}`;
37
+ } else {
38
+ runCommand += ` docker-php-ext-install ${extensionInstructionsWithoutCommand.name}`;
39
+ }
40
+ builder
41
+ .comment(`extension ${extensionName} installation command`)
42
+ .run(runCommand.trim());
43
+ };
44
+
45
+ /**
46
+ * @param {import('../../../typings/context').ListrContext} ctx
47
+ * @param {{ image: string, tag: string}} param1
48
+ */
49
+ const buildDockerFileInstructions = async (ctx, { image, tag }) => {
50
+ const { composer } = ctx.config.overridenConfiguration.configuration;
51
+ const existingPHPExtensions = await getEnabledExtensionsFromImage(`${image}:${tag}`);
52
+
53
+ const missingExtensions = Object.entries(
54
+ ctx.config.overridenConfiguration.configuration.php.extensions
55
+ ).filter(
56
+ ([extensionName, extensionInstructions]) => !Object.entries(existingPHPExtensions)
57
+ .map(([n, i]) => [n.toLowerCase(), i])
58
+ .some(
59
+ ([n]) => extensionName === n || (
60
+ extensionInstructions.alternativeName && extensionInstructions.alternativeName.map(
61
+ (s) => s.toLowerCase()
62
+ ).includes(n)
63
+ )
64
+ )
65
+ ).filter(([extensionName]) => extensionName.toLowerCase() !== 'xdebug');
66
+
67
+ const dockerFileInstructions = new DockerFileBuilder()
68
+ .comment('project image')
69
+ .from({ image, tag });
70
+
71
+ // install bash in image
72
+ dockerFileInstructions
73
+ .run('apk add --no-cache bash');
74
+
75
+ if (missingExtensions.length > 0) {
76
+ const allDependencies = missingExtensions.map(
77
+ ([_extensionName, extensionInstructions]) => (extensionInstructions.dependencies || [])
78
+ )
79
+ .reduce((acc, val) => acc.concat(val.filter((ex) => !acc.includes(ex))), []);
80
+
81
+ dockerFileInstructions.run(`apk add --no-cache ${allDependencies.join(' ')}`);
82
+ missingExtensions.forEach(addExtensionToBuilder(dockerFileInstructions, ctx));
83
+ }
84
+
85
+ const composerVersion = /^\d$/.test(composer.version)
86
+ ? `latest-${composer.version}.x`
87
+ : composer.version;
88
+
89
+ dockerFileInstructions
90
+ .comment('download composer')
91
+ .run(`curl https://getcomposer.org/download/${composerVersion}/composer.phar --output composer`)
92
+ .comment('make composer executable')
93
+ .run('chmod +x ./composer')
94
+ .comment('move composer to bin directory')
95
+ .run('mv composer /usr/local/bin/composer');
96
+
97
+ if (semver.satisfies(composer.version, '^1')) {
98
+ dockerFileInstructions
99
+ .comment('install prestissimo composer plugin')
100
+ .run('composer global require hirak/prestissimo');
101
+ }
102
+
103
+ dockerFileInstructions
104
+ .workDir(ctx.config.baseConfig.containerMagentoDir);
105
+
106
+ return dockerFileInstructions;
107
+ };
108
+
109
+ /**
110
+ * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
111
+ */
112
+ const buildProjectImage = () => ({
113
+ title: 'Building Project Image',
114
+ task: async (ctx, task) => {
115
+ const containers = ctx.config.docker.getContainers(ctx.ports);
116
+ const [image, tag = 'latest'] = ctx.config.overridenConfiguration.configuration.php.baseImage.split(':');
117
+ const dockerFileInstructions = await buildDockerFileInstructions(ctx, { image, tag });
118
+
119
+ try {
120
+ await execAsyncSpawn(`docker build -t ${containers.php.image} -<<EOF
121
+ ${dockerFileInstructions.build()}
122
+ EOF`, {
123
+ callback: (r) => {
124
+ task.output = r;
125
+ }
126
+ });
127
+ } catch (e) {
128
+ throw new KnownError(`Unexpected error during project image building!\n\n${e}`);
129
+ }
130
+ },
131
+ options: {
132
+ bottomBar: 10
133
+ }
134
+ });
135
+
136
+ /**
137
+ * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
138
+ */
139
+ const buildDebugProjectImage = () => ({
140
+ title: 'Building Debug Project Image',
141
+ task: async (ctx, task) => {
142
+ const containers = ctx.config.docker.getContainers(ctx.ports);
143
+ const [image, tag = 'latest'] = ctx.config.overridenConfiguration.configuration.php.debugImage.split(':');
144
+ const dockerFileInstructions = await buildDockerFileInstructions(ctx, { image, tag });
145
+
146
+ try {
147
+ await execAsyncSpawn(`docker build -t ${containers.php.debugImage} -<<EOF
148
+ ${dockerFileInstructions.build()}
149
+ EOF`, {
150
+ callback: (r) => {
151
+ task.output = r;
152
+ }
153
+ });
154
+ } catch (e) {
155
+ throw new KnownError(`Unexpected error during debug project image building!\n\n${e}`);
156
+ }
157
+ },
158
+ options: {
159
+ bottomBar: 10
160
+ }
161
+ });
162
+
163
+ module.exports = {
164
+ buildProjectImage,
165
+ buildDebugProjectImage,
166
+ getEnabledExtensionsFromImage
167
+ };
@@ -0,0 +1,8 @@
1
+ const volumeApi = require('./volume-api');
2
+ const { createVolumes, removeVolumes } = require('./tasks');
3
+
4
+ module.exports = {
5
+ createVolumes,
6
+ removeVolumes,
7
+ volumeApi
8
+ };
@@ -1,21 +1,8 @@
1
- const { execAsyncSpawn } = require('../../util/exec-async-command');
2
-
3
- const create = ({
4
- driver,
5
- opts = {},
6
- name
7
- }) => {
8
- let command = `docker volume create ${ Object.entries(opts).map(([name, value]) => `--opt ${name}=${value}`).join(' ') } `;
9
-
10
- if (driver) {
11
- command += `--driver ${ driver }`;
12
- }
13
-
14
- return execAsyncSpawn(`${ command } ${ name }`);
15
- };
1
+ const { execAsyncSpawn } = require('../../../util/exec-async-command');
2
+ const { create } = require('./volume-api');
16
3
 
17
4
  /**
18
- * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
5
+ * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
19
6
  */
20
7
  const createVolumes = () => ({
21
8
  title: 'Creating volumes',
@@ -36,7 +23,7 @@ const createVolumes = () => ({
36
23
  });
37
24
 
38
25
  /**
39
- * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
26
+ * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
40
27
  */
41
28
  const removeVolumes = () => ({
42
29
  title: 'Removing volumes',
@@ -58,6 +45,5 @@ const removeVolumes = () => ({
58
45
 
59
46
  module.exports = {
60
47
  createVolumes,
61
- removeVolumes,
62
- createVolume: create
48
+ removeVolumes
63
49
  };
@@ -0,0 +1,39 @@
1
+ import { ExecAsyncSpawnOptions } from '../../../util/exec-async-command';
2
+
3
+ export interface VolumeLsOptions<T extends boolean = false> {
4
+ filter?: string | string[]
5
+ format?: string
6
+ formatToJSON?: T
7
+ quiet?: boolean
8
+ }
9
+
10
+ export interface VolumeLsResult {
11
+ Driver: string
12
+ Labels: string
13
+ Links: string
14
+ MountPoint: string
15
+ Name: string
16
+ Scope: string
17
+ Size: string
18
+ }
19
+
20
+ export function ls(
21
+ options?: VolumeLsOptions,
22
+ execOptions?: ExecAsyncSpawnOptions<false>
23
+ ): Promise<string>
24
+ export function ls(
25
+ options?: VolumeLsOptions<true>,
26
+ execOptions?: ExecAsyncSpawnOptions<false>
27
+ ): Promise<VolumeLsResult[]>
28
+
29
+ export interface VolumeCreateOptions {
30
+ driver?: string
31
+ label?: string
32
+ name: string
33
+ opt?: Record<string, string>
34
+ }
35
+
36
+ export function create(
37
+ options?: VolumeCreateOptions,
38
+ execOptions?: ExecAsyncSpawnOptions<false>
39
+ ): Promise<string>
@@ -0,0 +1,66 @@
1
+ const { execAsyncSpawn } = require('../../../util/exec-async-command');
2
+
3
+ /**
4
+ * @param {import('./volume-api').VolumeCreateOptions} options
5
+ * @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
6
+ */
7
+ const create = async (options, execOptions = {}) => {
8
+ const {
9
+ driver,
10
+ label,
11
+ opt,
12
+ name
13
+ } = options;
14
+
15
+ const driverArg = driver && `--driver=${driver}`;
16
+ const labelArg = label && `--label=${label}`;
17
+ const optArg = opt && Object.entries(opt).map(([name, value]) => `--opt ${name}='${value}'`).join(' ');
18
+
19
+ const args = [
20
+ driverArg,
21
+ labelArg,
22
+ optArg,
23
+ name
24
+ ].filter(Boolean).join(' ');
25
+
26
+ return execAsyncSpawn(`docker volume create ${args}`, execOptions);
27
+ };
28
+
29
+ /**
30
+ * @param {import('./volume-api').VolumeLsOptions} options
31
+ * @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
32
+ */
33
+ const ls = async (options, execOptions = {}) => {
34
+ const {
35
+ filter,
36
+ format,
37
+ formatToJSON = false,
38
+ quiet
39
+ } = options;
40
+
41
+ const formatArg = !formatToJSON && format
42
+ ? `--format=${format}`
43
+ : formatToJSON && '--format=\'{{json .}}\'';
44
+ const filterArg = filter && typeof filter === 'string'
45
+ ? `--filter=${filter}`
46
+ : filter && Array.isArray(filter) && filter.every((f) => typeof f === 'string') && filter.map((f) => `--filter=${f}`).join(' ');
47
+ const quietArg = quiet && '--quiet';
48
+
49
+ const args = [
50
+ filterArg,
51
+ formatArg,
52
+ quietArg
53
+ ].filter(Boolean).join(' ');
54
+
55
+ if (formatToJSON) {
56
+ const result = await execAsyncSpawn(`docker volume ls ${args}`, execOptions);
57
+ return JSON.parse(`[${result.split('\n').join(', ')}]`);
58
+ }
59
+
60
+ return execAsyncSpawn(`docker volume ls ${args}`, execOptions);
61
+ };
62
+
63
+ module.exports = {
64
+ create,
65
+ ls
66
+ };
@@ -1,4 +1,4 @@
1
- // const path = require('path');
1
+ const os = require('os');
2
2
  const { spawn } = require('child_process');
3
3
 
4
4
  const executeInContainer = ({ containerName, commands }) => {
@@ -7,11 +7,14 @@ const executeInContainer = ({ containerName, commands }) => {
7
7
  process.exit(1);
8
8
  }
9
9
 
10
+ const userArg = os.platform() === 'linux' && `--user=${os.userInfo().uid}:${os.userInfo().gid}`;
11
+
10
12
  spawn('docker', [
11
13
  'exec',
12
14
  '-it',
15
+ userArg,
13
16
  containerName
14
- ].concat(...commands.map((command) => command.split(' '))), {
17
+ ].filter(Boolean).concat(...commands.map((command) => command.split(' '))), {
15
18
  stdio: [0, 1, 2]
16
19
  });
17
20
 
@@ -0,0 +1,23 @@
1
+ const path = require('path');
2
+ const UnknownError = require('../../errors/unknown-error');
3
+ const setConfigFile = require('../../util/set-config');
4
+
5
+ /**
6
+ * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
7
+ */
8
+ const createMariaDBConfig = () => ({
9
+ title: 'Setting MariaDB config',
10
+ task: async (ctx) => {
11
+ try {
12
+ await setConfigFile({
13
+ configPathname: path.join(ctx.config.baseConfig.cacheDir, 'mariadb.cnf'),
14
+ template: path.join(ctx.config.baseConfig.templateDir, 'mariadb.template.cnf'),
15
+ overwrite: true
16
+ });
17
+ } catch (e) {
18
+ throw new UnknownError(`Unexpected error accrued during php-fpm config creation\n\n${e}`);
19
+ }
20
+ }
21
+ });
22
+
23
+ module.exports = createMariaDBConfig;
@@ -1,4 +1,3 @@
1
- const os = require('os');
2
1
  const path = require('path');
3
2
  const setConfigFile = require('../../util/set-config');
4
3
  const UnknownError = require('../../errors/unknown-error');
@@ -24,7 +23,7 @@ const createNginxConfig = () => ({
24
23
  }
25
24
  } = overridenConfiguration;
26
25
 
27
- const isLinux = os.platform() === 'linux';
26
+ const isLinux = ctx.platform === 'linux';
28
27
  const isNativeLinux = isLinux && !isWsl;
29
28
  const hostMachine = isNativeLinux ? '127.0.0.1' : 'host.docker.internal';
30
29
  const hostPort = isNativeLinux ? ports.app : 80;
@@ -41,7 +40,7 @@ const createNginxConfig = () => ({
41
40
  overwrite: true,
42
41
  templateArgs: {
43
42
  ports,
44
- mageRoot: baseConfig.magentoDir,
43
+ mageRoot: baseConfig.containerMagentoDir,
45
44
  hostMachine,
46
45
  hostPort,
47
46
  config: overridenConfiguration
@@ -1,24 +1,39 @@
1
1
  const semver = require('semver');
2
2
  const UnknownError = require('../../errors/unknown-error');
3
3
  const setConfigFile = require('../../util/set-config');
4
+ const { getEnabledExtensionsFromImage } = require('../docker/project-image-builder');
4
5
 
5
6
  /**
6
7
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
7
8
  */
8
9
  const createPhpConfig = () => ({
9
10
  title: 'Setting PHP config',
10
- task: async ({ config: { php, baseConfig, overridenConfiguration: { configuration } }, debug, ports }) => {
11
- const isXDebug2 = semver.satisfies(configuration.php.extensions.xdebug.version, '2');
11
+ task: async (ctx) => {
12
+ const {
13
+ config: {
14
+ php,
15
+ baseConfig
16
+ },
17
+ debug
18
+ } = ctx;
19
+ const containers = ctx.config.docker.getContainers(ctx.ports);
20
+ const phpExtensions = await getEnabledExtensionsFromImage(containers.php.debugImage);
21
+ const isXDebug2 = semver.satisfies(phpExtensions.xdebug, '2');
22
+
23
+ const isLinux = ctx.platform === 'linux';
24
+ const isNativeLinux = isLinux && !ctx.isWsl;
25
+ const hostMachine = isNativeLinux ? '127.0.0.1' : 'host.docker.internal';
26
+
12
27
  try {
13
28
  await setConfigFile({
14
29
  configPathname: php.iniPath,
15
30
  template: php.iniTemplatePath,
16
31
  overwrite: true,
17
32
  templateArgs: {
18
- ports,
19
33
  debug,
20
- mageRoot: baseConfig.magentoDir,
21
- isXDebug2
34
+ mageRoot: baseConfig.containerMagentoDir,
35
+ isXDebug2,
36
+ hostMachine
22
37
  }
23
38
  });
24
39
  } catch (e) {
@@ -1,4 +1,3 @@
1
- const path = require('path');
2
1
  const UnknownError = require('../../errors/unknown-error');
3
2
  const setConfigFile = require('../../util/set-config');
4
3
 
@@ -7,14 +6,19 @@ const setConfigFile = require('../../util/set-config');
7
6
  */
8
7
  const createPhpFpmConfig = () => ({
9
8
  title: 'Setting php-fpm config',
10
- task: async ({ ports, config: { php, baseConfig } }) => {
9
+ task: async (ctx) => {
10
+ const { config: { php } } = ctx;
11
+ const isLinux = ctx.platform === 'linux';
12
+ const isNativeLinux = isLinux && !ctx.isWsl;
13
+ const port = isNativeLinux ? ctx.ports.fpm : 9000;
14
+
11
15
  try {
12
16
  await setConfigFile({
13
17
  configPathname: php.fpmConfPath,
14
- template: path.join(baseConfig.templateDir, 'php-fpm.template.conf'),
18
+ template: php.fpmTemplatePath,
15
19
  overwrite: true,
16
20
  templateArgs: {
17
- ports
21
+ port
18
22
  }
19
23
  });
20
24
  } catch (e) {
@@ -1,17 +1,26 @@
1
1
  const path = require('path');
2
2
  const { loadXmlFile, buildXmlFile } = require('../../../config/xml-parser');
3
3
  const pathExists = require('../../../util/path-exists');
4
+ const {
5
+ urlKey, typeKey, versionKey, nameKey
6
+ } = require('./keys');
4
7
  const { formatPathForPHPStormConfig } = require('./xml-utils');
5
8
 
6
9
  const pathToModulesConfig = path.join(process.cwd(), '.idea', 'modules.xml');
7
10
  const excludeFoldersPaths = [
8
11
  'bin',
9
12
  'dev',
10
- 'pub',
11
- 'setup',
13
+ 'pub/static',
12
14
  'var/cache',
13
15
  'var/page_cache',
14
- 'var/log'
16
+ 'var/log',
17
+ 'var/composer_home',
18
+ 'var/view_preprocessed'
19
+ ].map((p) => `file://$MODULE_DIR$/${p}`);
20
+
21
+ const mustBeIncludedPaths = [
22
+ 'pub',
23
+ 'setup'
15
24
  ].map((p) => `file://$MODULE_DIR$/${p}`);
16
25
 
17
26
  /**
@@ -24,26 +33,23 @@ const getProjectConfigFilePath = async () => {
24
33
  return modulesConfigData.project.component.modules.module['@_filepath'].replace('$PROJECT_DIR$', process.cwd());
25
34
  };
26
35
 
27
- /**
28
- * @returns {Array<{'@_url': string}>}
29
- */
30
- const getExcludedFoldersConfig = (projectConfigData) => {
36
+ const setupDefaultsForExcludedFoldersConfig = (projectConfigData) => {
31
37
  if (!projectConfigData.module) {
32
38
  projectConfigData.module = {
33
- '@_type': 'WEB_MODULE',
34
- '@_version': '4'
39
+ [typeKey]: 'WEB_MODULE',
40
+ [versionKey]: '4'
35
41
  };
36
42
  }
37
43
 
38
44
  if (!projectConfigData.module.component) {
39
45
  projectConfigData.module.component = {
40
- '@_name': 'NewModuleRootManager',
46
+ [nameKey]: 'NewModuleRootManager',
41
47
  orderEntry: [
42
48
  {
43
- '@_type': 'inheritedJdk'
49
+ [typeKey]: 'inheritedJdk'
44
50
  },
45
51
  {
46
- '@_type': 'sourceFolder',
52
+ [typeKey]: 'sourceFolder',
47
53
  '@_forTest': 'false'
48
54
  }
49
55
  ]
@@ -52,37 +58,42 @@ const getExcludedFoldersConfig = (projectConfigData) => {
52
58
 
53
59
  if (!projectConfigData.module.component.content) {
54
60
  projectConfigData.module.component.content = {
55
- '@_url': 'file://$MODULE_DIR$'
61
+ [urlKey]: 'file://$MODULE_DIR$'
56
62
  };
57
63
  }
58
64
 
59
65
  if (!projectConfigData.module.component.content.excludeFolder) {
60
66
  projectConfigData.module.component.content.excludeFolder = [];
61
67
  }
62
-
63
- return projectConfigData
64
- .module.component.content.excludeFolder;
65
68
  };
66
69
 
67
- const setupExcludedFolders = (excludedFoldersConfig) => {
70
+ const setupExcludedFolders = (projectConfigData) => {
71
+ const { excludeFolder } = projectConfigData.module.component.content;
68
72
  let hasChanges = false;
69
73
  // filter excluded folders to get ones that needs to be added to excluded folders list
70
74
  const missingExcludedFolders = excludeFoldersPaths
71
75
  .filter(
72
- (excludeFoldersPath) => !excludedFoldersConfig.some(
73
- (config) => config['@_url'] === excludeFoldersPath
76
+ (excludeFoldersPath) => !excludeFolder.some(
77
+ (config) => config[urlKey] === excludeFoldersPath
74
78
  )
75
79
  );
76
80
 
77
81
  if (missingExcludedFolders.length > 0) {
78
82
  hasChanges = true;
79
83
  missingExcludedFolders.forEach((missingExcludedFolder) => {
80
- excludedFoldersConfig.unshift({
81
- '@_url': missingExcludedFolder
84
+ projectConfigData.module.component.content.excludeFolder.unshift({
85
+ [urlKey]: missingExcludedFolder
82
86
  });
83
87
  });
84
88
  }
85
89
 
90
+ const hasSomePathsThatMustBeFiltered = excludeFolder.some((config) => mustBeIncludedPaths.includes(config[urlKey]));
91
+
92
+ if (hasSomePathsThatMustBeFiltered) {
93
+ projectConfigData.module.component.content.excludeFolder = excludeFolder.filter((config) => !mustBeIncludedPaths.includes(config[urlKey]));
94
+ hasChanges = true;
95
+ }
96
+
86
97
  return hasChanges;
87
98
  };
88
99
 
@@ -94,13 +105,13 @@ const getIMLFilePath = async () => {
94
105
 
95
106
  const modulesConfig = {
96
107
  '?xml': {
97
- '@_version': '1.0',
108
+ [versionKey]: '1.0',
98
109
  '@_encoding': 'UTF-8'
99
110
  },
100
111
  project: {
101
- '@_version': '4',
112
+ [versionKey]: '4',
102
113
  component: {
103
- '@_name': 'ProjectModuleManager',
114
+ [nameKey]: 'ProjectModuleManager',
104
115
  modules: [
105
116
  {
106
117
  module: {
@@ -129,8 +140,8 @@ const setupExcludedFoldersConfig = () => ({
129
140
  const projectFilePath = await getProjectConfigFilePath();
130
141
  if (await pathExists(projectFilePath)) {
131
142
  const projectConfigData = await loadXmlFile(projectFilePath);
132
- const excludedFoldersConfig = getExcludedFoldersConfig(projectConfigData);
133
- const hasChanges = setupExcludedFolders(excludedFoldersConfig);
143
+ setupDefaultsForExcludedFoldersConfig(projectConfigData);
144
+ const hasChanges = setupExcludedFolders(projectConfigData);
134
145
  if (hasChanges) {
135
146
  await buildXmlFile(projectFilePath, projectConfigData);
136
147
  } else {
@@ -144,12 +155,13 @@ const setupExcludedFoldersConfig = () => ({
144
155
  const projectFilePath = await getIMLFilePath();
145
156
  const projectConfigData = {
146
157
  '?xml': {
147
- '@_version': '1.0',
158
+ [versionKey]: '1.0',
148
159
  '@_encoding': 'UTF-8'
149
160
  }
150
161
  };
151
- const excludedFoldersConfig = getExcludedFoldersConfig(projectConfigData);
152
- setupExcludedFolders(excludedFoldersConfig);
162
+
163
+ setupDefaultsForExcludedFoldersConfig(projectConfigData);
164
+ setupExcludedFolders(projectConfigData);
153
165
 
154
166
  await buildXmlFile(projectFilePath, projectConfigData);
155
167
  }
@@ -5,6 +5,7 @@ const setupInspectionToolsConfig = require('./inspection-tools-config');
5
5
  const setupExcludedFoldersConfig = require('./exclude-folder-config');
6
6
  const setupStylelintConfig = require('./stylelint-config');
7
7
  const setupESLintConfig = require('./eslint-config');
8
+ const setupPhpDockerSettingsConfig = require('./php-docker-settings-config');
8
9
 
9
10
  /**
10
11
  * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
@@ -14,6 +15,7 @@ const createPhpStormConfig = () => ({
14
15
  task: (ctx, task) => task.newListr([
15
16
  setupWorkspaceConfig(),
16
17
  setupPhpConfig(),
18
+ setupPhpDockerSettingsConfig(),
17
19
  setupDatabaseConfig(),
18
20
  setupInspectionToolsConfig(),
19
21
  setupExcludedFoldersConfig(),
@@ -4,11 +4,25 @@ const nameKey = '@_name';
4
4
  const valueKey = '@_value';
5
5
  const toolPathKey = '@_tool_path';
6
6
  const standardsKey = '@_standards';
7
+ const urlKey = '@_url';
8
+ const typeKey = '@_type';
9
+ const versionKey = '@_version';
10
+
11
+ /**
12
+ * Makes a xml property key
13
+ * @param {string} key
14
+ * @returns {string}
15
+ */
16
+ const propertyKey = (key) => `@_${key}`;
7
17
 
8
18
  module.exports = {
9
19
  classKey,
10
20
  nameKey,
11
21
  valueKey,
12
22
  toolPathKey,
13
- standardsKey
23
+ standardsKey,
24
+ urlKey,
25
+ typeKey,
26
+ versionKey,
27
+ propertyKey
14
28
  };