@scandipwa/magento-scripts 2.0.3 → 2.0.5

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 (347) hide show
  1. package/.eslintrc +6 -1
  2. package/exec.js +75 -39
  3. package/index.js +87 -46
  4. package/lib/commands/cleanup.js +18 -21
  5. package/lib/commands/cli.js +138 -73
  6. package/lib/commands/execute.js +5 -5
  7. package/lib/commands/import-db.js +21 -24
  8. package/lib/commands/link.js +17 -20
  9. package/lib/commands/logs.js +91 -91
  10. package/lib/commands/start.js +229 -191
  11. package/lib/commands/status.js +64 -50
  12. package/lib/commands/stop.js +14 -11
  13. package/lib/config/check-configuration-file.js +33 -28
  14. package/lib/config/cma-config.js +4 -4
  15. package/lib/config/config.js +40 -18
  16. package/lib/config/dependencies-for-platforms.js +33 -3
  17. package/lib/config/docker.js +259 -160
  18. package/lib/config/get-magento-version-config.js +45 -38
  19. package/lib/config/get-port-config.js +30 -44
  20. package/lib/config/get-project-configuration.js +8 -8
  21. package/lib/config/index.js +51 -42
  22. package/lib/config/magento/required-php-extensions/index.js +33 -19
  23. package/lib/config/magento/required-php-extensions/magento-2.3.js +2 -2
  24. package/lib/config/magento/required-php-extensions/magento-2.4.js +2 -2
  25. package/lib/config/magento-config.js +4 -4
  26. package/lib/config/php-config.js +8 -6
  27. package/lib/config/port-config.js +62 -43
  28. package/lib/config/save-config.js +6 -6
  29. package/lib/config/scandipwa-versions.js +2 -2
  30. package/lib/config/services/composer/versions/composer-1.js +2 -2
  31. package/lib/config/services/composer/versions/composer-2.js +2 -2
  32. package/lib/config/services/composer/versions/index.js +1 -1
  33. package/lib/config/services/elasticsearch/base-repo.js +1 -1
  34. package/lib/config/services/elasticsearch/default-es-env.js +4 -1
  35. package/lib/config/services/elasticsearch/versions/elasticsearch-6.8.js +17 -14
  36. package/lib/config/services/elasticsearch/versions/elasticsearch-7.10.js +4 -4
  37. package/lib/config/services/elasticsearch/versions/elasticsearch-7.12.js +4 -4
  38. package/lib/config/services/elasticsearch/versions/elasticsearch-7.16.js +4 -4
  39. package/lib/config/services/elasticsearch/versions/elasticsearch-7.17.js +4 -4
  40. package/lib/config/services/elasticsearch/versions/elasticsearch-7.6.js +4 -4
  41. package/lib/config/services/elasticsearch/versions/elasticsearch-7.7.js +4 -4
  42. package/lib/config/services/elasticsearch/versions/elasticsearch-7.9.js +4 -4
  43. package/lib/config/services/elasticsearch/versions/index.js +9 -9
  44. package/lib/config/services/maildev/index.js +5 -2
  45. package/lib/config/services/mariadb/versions/index.js +1 -1
  46. package/lib/config/services/mariadb/versions/mariadb-10.2.js +5 -4
  47. package/lib/config/services/mariadb/versions/mariadb-10.3.js +5 -4
  48. package/lib/config/services/mariadb/versions/mariadb-10.4.js +5 -4
  49. package/lib/config/services/nginx/versions/index.js +1 -1
  50. package/lib/config/services/nginx/versions/nginx-1.18.js +5 -4
  51. package/lib/config/services/php/base-repo.js +1 -1
  52. package/lib/config/services/php/extensions/apcu.js +3 -3
  53. package/lib/config/services/php/extensions/bcmath.js +2 -2
  54. package/lib/config/services/php/extensions/curl.js +3 -6
  55. package/lib/config/services/php/extensions/gd.js +4 -3
  56. package/lib/config/services/php/extensions/index.js +9 -8
  57. package/lib/config/services/php/extensions/intl.js +3 -5
  58. package/lib/config/services/php/extensions/opcache.js +3 -5
  59. package/lib/config/services/php/extensions/pdo_mysql.js +2 -2
  60. package/lib/config/services/php/extensions/soap.js +3 -5
  61. package/lib/config/services/php/extensions/sodium.js +3 -5
  62. package/lib/config/services/php/extensions/xdebug.js +5 -3
  63. package/lib/config/services/php/extensions/xsl.js +3 -5
  64. package/lib/config/services/php/extensions/zip.js +3 -5
  65. package/lib/config/services/php/versions/index.js +1 -1
  66. package/lib/config/services/php/versions/php-7.2.js +13 -9
  67. package/lib/config/services/php/versions/php-7.3.js +13 -9
  68. package/lib/config/services/php/versions/php-7.4.js +13 -9
  69. package/lib/config/services/php/versions/php-8.1.js +13 -9
  70. package/lib/config/services/redis/index.js +1 -1
  71. package/lib/config/services/redis/redis-5.0.js +2 -2
  72. package/lib/config/services/redis/redis-6.0.js +2 -2
  73. package/lib/config/services/redis/redis-6.2.js +2 -2
  74. package/lib/config/services/ssl-terminator/index.js +6 -5
  75. package/lib/config/services/varnish/index.js +1 -1
  76. package/lib/config/services/varnish/varnish-6-0.js +7 -5
  77. package/lib/config/services/varnish/varnish-6-6.js +7 -5
  78. package/lib/config/services/varnish/varnish-7-0.js +7 -5
  79. package/lib/config/system-config.js +55 -32
  80. package/lib/config/templates/mariadb.template.cnf +8 -0
  81. package/lib/config/versions/index.js +48 -27
  82. package/lib/config/versions/magento-2.2.10.js +22 -15
  83. package/lib/config/versions/magento-2.3.0.js +22 -15
  84. package/lib/config/versions/magento-2.3.1.js +22 -15
  85. package/lib/config/versions/magento-2.3.2-p1.js +22 -15
  86. package/lib/config/versions/magento-2.3.2-p2.js +22 -15
  87. package/lib/config/versions/magento-2.3.2.js +22 -15
  88. package/lib/config/versions/magento-2.3.3-p1.js +22 -15
  89. package/lib/config/versions/magento-2.3.3.js +22 -15
  90. package/lib/config/versions/magento-2.3.4-p1.js +22 -15
  91. package/lib/config/versions/magento-2.3.4-p2.js +22 -15
  92. package/lib/config/versions/magento-2.3.4.js +22 -15
  93. package/lib/config/versions/magento-2.3.5-p1.js +22 -15
  94. package/lib/config/versions/magento-2.3.5-p2.js +22 -15
  95. package/lib/config/versions/magento-2.3.5.js +27 -15
  96. package/lib/config/versions/magento-2.3.6-p1.js +22 -15
  97. package/lib/config/versions/magento-2.3.6.js +22 -15
  98. package/lib/config/versions/magento-2.3.7-p1.js +22 -15
  99. package/lib/config/versions/magento-2.3.7-p2.js +22 -15
  100. package/lib/config/versions/magento-2.3.7-p3.js +22 -15
  101. package/lib/config/versions/magento-2.3.7-p4.js +22 -15
  102. package/lib/config/versions/magento-2.3.7.js +22 -15
  103. package/lib/config/versions/magento-2.4.0-p1.js +22 -15
  104. package/lib/config/versions/magento-2.4.0.js +22 -15
  105. package/lib/config/versions/magento-2.4.1-p1.js +23 -16
  106. package/lib/config/versions/magento-2.4.1.js +23 -16
  107. package/lib/config/versions/magento-2.4.2-p1.js +23 -16
  108. package/lib/config/versions/magento-2.4.2-p2.js +23 -16
  109. package/lib/config/versions/magento-2.4.2.js +23 -16
  110. package/lib/config/versions/magento-2.4.3-p1.js +23 -16
  111. package/lib/config/versions/magento-2.4.3-p2.js +23 -16
  112. package/lib/config/versions/magento-2.4.3-p3.js +23 -16
  113. package/lib/config/versions/magento-2.4.3.js +23 -16
  114. package/lib/config/versions/magento-2.4.4-p1.js +23 -16
  115. package/lib/config/versions/magento-2.4.4-p2.js +23 -16
  116. package/lib/config/versions/magento-2.4.4.js +23 -16
  117. package/lib/config/versions/magento-2.4.5-p1.js +23 -16
  118. package/lib/config/versions/magento-2.4.5.js +23 -17
  119. package/lib/config/xml-parser.js +21 -20
  120. package/lib/errors/known-error.js +8 -6
  121. package/lib/errors/unknown-error.js +8 -6
  122. package/lib/tasks/cache/create-cache-folder.js +10 -10
  123. package/lib/tasks/cache/index.js +1 -1
  124. package/lib/tasks/cache/remove-cache-folder.js +9 -9
  125. package/lib/tasks/cleanup.js +22 -24
  126. package/lib/tasks/cli/create-bashrc-config.js +19 -11
  127. package/lib/tasks/cli/index.js +10 -13
  128. package/lib/tasks/composer/index.js +20 -15
  129. package/lib/tasks/composer/local-auth-json.js +32 -18
  130. package/lib/tasks/database/connect-to-database.js +71 -51
  131. package/lib/tasks/database/create-magento-database.js +7 -7
  132. package/lib/tasks/database/create-magento-user.js +33 -20
  133. package/lib/tasks/database/default-magento-database.js +1 -1
  134. package/lib/tasks/database/default-magento-user.js +2 -2
  135. package/lib/tasks/database/dump-theme-config.js +16 -12
  136. package/lib/tasks/database/fix-db.js +62 -52
  137. package/lib/tasks/database/import-dump-to-database.js +122 -85
  138. package/lib/tasks/database/import-remote-db/index.js +16 -18
  139. package/lib/tasks/database/import-remote-db/ssh/database-dump-command.js +2 -2
  140. package/lib/tasks/database/import-remote-db/ssh/index.js +34 -35
  141. package/lib/tasks/database/import-remote-db/ssh/readymage.js +41 -38
  142. package/lib/tasks/database/import-remote-db/ssh/regular-server.js +44 -46
  143. package/lib/tasks/database/index.js +1 -1
  144. package/lib/tasks/database/magento-tables.js +3 -3
  145. package/lib/tasks/database/restore-theme-config.js +26 -19
  146. package/lib/tasks/docker/api.d.ts +1 -1
  147. package/lib/tasks/docker/api.js +31 -33
  148. package/lib/tasks/docker/containers/container-api.d.ts +49 -14
  149. package/lib/tasks/docker/containers/container-api.js +112 -83
  150. package/lib/tasks/docker/containers/index.js +3 -3
  151. package/lib/tasks/docker/containers/tasks.js +171 -99
  152. package/lib/tasks/docker/convert-composer-home-to-composer-cache-volume.js +34 -25
  153. package/lib/tasks/docker/convert-legacy-volumes.js +91 -55
  154. package/lib/tasks/docker/convert-mysql-to-mariadb.js +178 -147
  155. package/lib/tasks/docker/image/image-api.d.ts +2 -3
  156. package/lib/tasks/docker/image/image-api.js +41 -34
  157. package/lib/tasks/docker/image/index.js +2 -2
  158. package/lib/tasks/docker/index.js +26 -21
  159. package/lib/tasks/docker/network/index.js +3 -3
  160. package/lib/tasks/docker/network/network-api.d.ts +11 -8
  161. package/lib/tasks/docker/network/network-api.js +53 -61
  162. package/lib/tasks/docker/network/tasks.js +41 -31
  163. package/lib/tasks/docker/project-image-builder.js +175 -92
  164. package/lib/tasks/docker/system/index.js +2 -2
  165. package/lib/tasks/docker/system/system-api.d.ts +2 -2
  166. package/lib/tasks/docker/system/system-api.js +16 -19
  167. package/lib/tasks/docker/volume/index.js +3 -3
  168. package/lib/tasks/docker/volume/tasks.js +63 -46
  169. package/lib/tasks/docker/volume/volume-api.d.ts +8 -5
  170. package/lib/tasks/docker/volume/volume-api.js +59 -76
  171. package/lib/tasks/execute.js +91 -55
  172. package/lib/tasks/file-system/create-mariadb-config.js +26 -11
  173. package/lib/tasks/file-system/create-nginx-config.js +18 -19
  174. package/lib/tasks/file-system/create-php-config.js +12 -8
  175. package/lib/tasks/file-system/create-php-debug-config.js +23 -18
  176. package/lib/tasks/file-system/create-php-fpm-config.js +14 -9
  177. package/lib/tasks/file-system/create-phpstorm-config/database-config.js +144 -112
  178. package/lib/tasks/file-system/create-phpstorm-config/eslint-config.js +69 -45
  179. package/lib/tasks/file-system/create-phpstorm-config/exclude-folder-config.js +69 -70
  180. package/lib/tasks/file-system/create-phpstorm-config/index.js +28 -24
  181. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/coding-standard-config.js +9 -9
  182. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/config.js +23 -23
  183. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/custom-ruleset-path-config.js +22 -19
  184. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/default-properties-config.js +26 -16
  185. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/eslint-inspection-config.js +14 -15
  186. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/index.js +43 -34
  187. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/inspection-tools-config.js +14 -6
  188. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/magento-coding-standard-config.js +9 -9
  189. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/mess-detector-validation-inspection-config.js +53 -47
  190. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/paths.js +41 -12
  191. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/php-cs-fixer-validation-inspection-config.js +33 -30
  192. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/php-cs-validation-inspection-config.js +35 -38
  193. package/lib/tasks/file-system/create-phpstorm-config/inspection-tools-config/stylelint-inspection-config.js +14 -15
  194. package/lib/tasks/file-system/create-phpstorm-config/keys.js +10 -10
  195. package/lib/tasks/file-system/create-phpstorm-config/php-config/index.js +33 -25
  196. package/lib/tasks/file-system/create-phpstorm-config/php-config/mess-detector-config.js +28 -25
  197. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-code-sniffer-config.js +53 -32
  198. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-config.js +7 -7
  199. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-cs-fixer-config.js +37 -27
  200. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-interpreters-config.js +53 -31
  201. package/lib/tasks/file-system/create-phpstorm-config/php-config/php-project-shared-configuration-config.js +42 -30
  202. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/index.js +33 -20
  203. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/php-docker-settings-config.js +3 -3
  204. package/lib/tasks/file-system/create-phpstorm-config/php-docker-settings-config/setup-php-docker-container-settings-config.js +27 -16
  205. package/lib/tasks/file-system/create-phpstorm-config/setup-xml-structure.js +14 -13
  206. package/lib/tasks/file-system/create-phpstorm-config/stylelint-config.js +52 -34
  207. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/composer-settings-config.js +41 -33
  208. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/format-setting-config.js +39 -27
  209. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/index.js +34 -30
  210. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/mess-detector-project-configuration-config.js +32 -22
  211. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-code-sniffer-project-configuration-config.js +32 -22
  212. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-cs-fixer-project-configuration-config.js +32 -22
  213. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-debug-general-config.js +42 -31
  214. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-server-config.js +45 -33
  215. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-stan-project-configuration-config.js.js +32 -22
  216. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-workspace-project-configuration-config.js +22 -19
  217. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/properties-component-config.js +35 -21
  218. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/psalm-project-configuration-config.js.js +31 -22
  219. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/run-manager-config.js +38 -28
  220. package/lib/tasks/file-system/create-phpstorm-config/workspace-config/workspace-config.js +5 -5
  221. package/lib/tasks/file-system/create-phpstorm-config/xml-utils.js +3 -2
  222. package/lib/tasks/file-system/create-ssl-terminator-config.js +46 -34
  223. package/lib/tasks/file-system/create-varnish-config.js +20 -23
  224. package/lib/tasks/file-system/create-vscode-config.js +66 -49
  225. package/lib/tasks/file-system/index.js +29 -25
  226. package/lib/tasks/import-dump.js +54 -45
  227. package/lib/tasks/link.js +24 -23
  228. package/lib/tasks/magento/enable-magento-composer-plugins.js +213 -149
  229. package/lib/tasks/magento/index.js +1 -1
  230. package/lib/tasks/magento/install-magento-project.js +158 -97
  231. package/lib/tasks/magento/remove-magento.js +30 -24
  232. package/lib/tasks/magento/setup-magento/adjust-full-page-cache.js +27 -15
  233. package/lib/tasks/magento/setup-magento/configure-elasticsearch.js +23 -10
  234. package/lib/tasks/magento/setup-magento/create-admin.js +21 -13
  235. package/lib/tasks/magento/setup-magento/delete-admin-users.js +5 -5
  236. package/lib/tasks/magento/setup-magento/delete-customers.js +16 -10
  237. package/lib/tasks/magento/setup-magento/delete-orders.js +16 -10
  238. package/lib/tasks/magento/setup-magento/disable-2fa.js +11 -8
  239. package/lib/tasks/magento/setup-magento/disable-maintenance-mode.js +7 -7
  240. package/lib/tasks/magento/setup-magento/disable-page-builder.js +5 -4
  241. package/lib/tasks/magento/setup-magento/flush-redis-config.js +14 -8
  242. package/lib/tasks/magento/setup-magento/increase-admin-session-lifetime.js +21 -17
  243. package/lib/tasks/magento/setup-magento/index-products.js +4 -6
  244. package/lib/tasks/magento/setup-magento/index.js +54 -47
  245. package/lib/tasks/magento/setup-magento/install-magento.js +112 -79
  246. package/lib/tasks/magento/setup-magento/migrate-database.js +115 -96
  247. package/lib/tasks/magento/setup-magento/set-base-url.js +35 -21
  248. package/lib/tasks/magento/setup-magento/set-deployment-mode.js +15 -13
  249. package/lib/tasks/magento/setup-magento/set-mail-config.js +20 -14
  250. package/lib/tasks/magento/setup-magento/set-url-rewrite.js +13 -9
  251. package/lib/tasks/magento/setup-magento/upgrade-magento.js +30 -22
  252. package/lib/tasks/magento/setup-magento/urn-highlighter.js +11 -11
  253. package/lib/tasks/magento/setup-magento/varnish-config.js +42 -32
  254. package/lib/tasks/magento/setup-magento/waiting-for-redis.js +6 -8
  255. package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +108 -65
  256. package/lib/tasks/magento/uninstall-magento.js +19 -16
  257. package/lib/tasks/php/php-container.d.ts +19 -0
  258. package/lib/tasks/php/php-container.js +50 -46
  259. package/lib/tasks/php/update-env-php.js +50 -30
  260. package/lib/tasks/project-config/index.js +12 -8
  261. package/lib/tasks/requirements/composer-credentials.js +215 -112
  262. package/lib/tasks/requirements/docker/context.js +49 -37
  263. package/lib/tasks/requirements/docker/index.js +123 -89
  264. package/lib/tasks/requirements/docker/install-on-mac.js +21 -14
  265. package/lib/tasks/requirements/docker/install.js +63 -52
  266. package/lib/tasks/requirements/docker/performance.js +39 -24
  267. package/lib/tasks/requirements/docker/permissions.js +27 -17
  268. package/lib/tasks/requirements/docker/running-status.js +79 -66
  269. package/lib/tasks/requirements/docker/version.js +15 -11
  270. package/lib/tasks/requirements/index.js +33 -29
  271. package/lib/tasks/requirements/node-version.js +8 -8
  272. package/lib/tasks/requirements/php-version.js +14 -11
  273. package/lib/tasks/requirements/platform.js +42 -26
  274. package/lib/tasks/requirements/rosetta.js +15 -12
  275. package/lib/tasks/start.js +172 -148
  276. package/lib/tasks/status/index.js +155 -88
  277. package/lib/tasks/stop.js +22 -18
  278. package/lib/tasks/theme/build-theme.js +50 -33
  279. package/lib/tasks/theme/install-theme.js +31 -18
  280. package/lib/tasks/theme/link-theme.js +27 -21
  281. package/lib/tasks/theme/retrieve-theme-data.js +24 -18
  282. package/lib/tasks/theme/setup-themes.js +87 -59
  283. package/lib/tasks/theme/symlink-theme.js +44 -22
  284. package/lib/util/CSA-theme.js +23 -21
  285. package/lib/util/analytics.js +130 -75
  286. package/lib/util/arch.js +22 -18
  287. package/lib/util/clean-object.js +15 -10
  288. package/lib/util/config-file-validator.js +74 -55
  289. package/lib/util/config-php-json.js +34 -16
  290. package/lib/util/connection-string.js +41 -27
  291. package/lib/util/console-block.js +112 -65
  292. package/lib/util/database.js +56 -33
  293. package/lib/util/deepmerge.d.ts +1 -1
  294. package/lib/util/deepmerge.js +19 -28
  295. package/lib/util/dockerfile-builder/build-instructions.js +159 -143
  296. package/lib/util/dockerfile-builder/index.js +47 -73
  297. package/lib/util/dockerfile-builder/types.d.ts +2 -1
  298. package/lib/util/download-file.js +28 -16
  299. package/lib/util/env-php-json.js +42 -16
  300. package/lib/util/exec-async-command.d.ts +9 -9
  301. package/lib/util/exec-async-command.js +82 -59
  302. package/lib/util/exec-async.d.ts +2 -0
  303. package/lib/util/exec-async.js +12 -5
  304. package/lib/util/execute-in-container.js +22 -27
  305. package/lib/util/execute-sudo-command.js +11 -15
  306. package/lib/util/get-brew-bin-path.js +27 -23
  307. package/lib/util/get-installed-magento-version.js +22 -16
  308. package/lib/util/get-jsonfile-data.js +14 -9
  309. package/lib/util/install-dependencies-task.js +53 -41
  310. package/lib/util/instance-metadata.js +44 -29
  311. package/lib/util/ip.js +16 -12
  312. package/lib/util/is-running-root.js +6 -3
  313. package/lib/util/is-wsl.js +10 -10
  314. package/lib/util/macos-version.js +12 -11
  315. package/lib/util/magento-task.js +14 -9
  316. package/lib/util/match-filesystem.js +22 -16
  317. package/lib/util/move-file.js +40 -25
  318. package/lib/util/nginx-logs-parser.js +50 -39
  319. package/lib/util/open-browser.js +10 -5
  320. package/lib/util/os-platform.js +40 -32
  321. package/lib/util/path-exists-sync.js +10 -6
  322. package/lib/util/path-exists.js +6 -6
  323. package/lib/util/php-task.js +11 -10
  324. package/lib/util/portscanner.js +97 -85
  325. package/lib/util/prefix.js +31 -22
  326. package/lib/util/resolve-configuration-with-overrides.js +30 -15
  327. package/lib/util/rmdir-safe.js +15 -11
  328. package/lib/util/run-composer.js +16 -16
  329. package/lib/util/run-container-image.js +9 -4
  330. package/lib/util/run-magento.js +16 -17
  331. package/lib/util/run-php.js +16 -21
  332. package/lib/util/safe-regex-extract.js +8 -12
  333. package/lib/util/set-config.js +24 -15
  334. package/lib/util/sleep.js +7 -2
  335. package/lib/util/systemctl.js +62 -44
  336. package/lib/util/wait-for-it.js +42 -33
  337. package/lib/util/wait-for-logs.js +42 -35
  338. package/lib/util/xdg-open-exists.js +19 -19
  339. package/package.json +7 -3
  340. package/tsconfig.json +24 -0
  341. package/typings/context.d.ts +76 -34
  342. package/typings/index.d.ts +54 -20
  343. package/typings/override.d.ts +14 -0
  344. package/typings/phpstorm.d.ts +19 -19
  345. package/.prettierrc +0 -3
  346. package/lib/util/get-php-for-phpbrew.js +0 -30
  347. package/lib/util/request.js +0 -0
@@ -1,95 +1,132 @@
1
- const path = require('path');
2
- const os = require('os');
3
- const { DockerFileBuilder } = require('../../util/dockerfile-builder');
4
- const { execAsyncSpawn } = require('../../util/exec-async-command');
5
- const KnownError = require('../../errors/known-error');
6
- const { runContainerImage } = require('../../util/run-container-image');
7
- const { imageApi } = require('./image');
1
+ const path = require('path')
2
+ const os = require('os')
3
+ const { DockerFileBuilder } = require('../../util/dockerfile-builder')
4
+ const { execAsyncSpawn } = require('../../util/exec-async-command')
5
+ const KnownError = require('../../errors/known-error')
6
+ const { runContainerImage } = require('../../util/run-container-image')
7
+ const { imageApi } = require('./image')
8
8
 
9
9
  /**
10
10
  * Get enabled extensions list with versions
11
11
  * @param {string} imageWithTag
12
- * @returns {Promise<{[key: string]: string}}>}
12
+ * @returns {Promise<{[key: string]: string}>}>}
13
13
  */
14
14
  const getEnabledExtensionsFromImage = async (imageWithTag) => {
15
15
  const output = await runContainerImage(
16
16
  imageWithTag,
17
- // eslint-disable-next-line quotes
17
+
18
18
  `php -r 'foreach (get_loaded_extensions() as $extension) echo "$extension:" . phpversion($extension) . "\n";'`
19
- );
19
+ )
20
20
 
21
21
  return output
22
22
  .split('\n')
23
23
  .map((m) => {
24
- // eslint-disable-next-line no-unused-vars
25
- const [_, moduleName, moduleVersion] = m.match(/(.+):(.+)/i);
24
+ const moduleMatch = m.match(/(.+):(.+)/i)
25
+
26
+ if (moduleMatch) {
27
+ const [_, moduleName, moduleVersion] = moduleMatch
28
+
29
+ return [moduleName, moduleVersion]
30
+ }
26
31
 
27
- return [moduleName, moduleVersion];
32
+ return []
28
33
  })
29
- .reduce((acc, [name, version]) => ({ ...acc, [name]: version }), {});
30
- };
31
-
32
- const addExtensionToBuilder = (builder, ctx) => async ([extensionName, extensionInstructions]) => {
33
- const { command, ...extensionInstructionsWithoutCommand } = extensionInstructions;
34
- let runCommand = '';
35
- if (typeof command === 'string') {
36
- runCommand += ` ${command}`;
37
- } else if (typeof command === 'function' || command instanceof Promise) {
38
- runCommand += ` ${await Promise.resolve(command({ ...extensionInstructionsWithoutCommand, ctx }))}`;
39
- } else {
40
- runCommand += ` docker-php-ext-install ${extensionInstructionsWithoutCommand.name || extensionName}`;
34
+ .filter((a) => a.length > 0)
35
+ .reduce((acc, [name, version]) => ({ ...acc, [name]: version }), {})
36
+ }
37
+
38
+ /**
39
+ * @type {(builder: DockerFileBuilder, ctx: import('../../../typings/context').ListrContext) => ([extensionName, extensionInstructions]: [string, import('../../../typings').PHPExtensionInstallationInstruction]) => Promise<void>}
40
+ */
41
+ const addExtensionToBuilder =
42
+ (builder, ctx) =>
43
+ async ([extensionName, extensionInstructions]) => {
44
+ const { command, ...extensionInstructionsWithoutCommand } =
45
+ extensionInstructions
46
+ let runCommand = ''
47
+ if (typeof command === 'string') {
48
+ runCommand += ` ${command}`
49
+ } else if (command instanceof Promise) {
50
+ runCommand += ` ${await Promise.resolve(
51
+ command({ ...extensionInstructionsWithoutCommand, ctx })
52
+ )}`
53
+ } else {
54
+ runCommand += ` docker-php-ext-install ${
55
+ extensionInstructionsWithoutCommand.name || extensionName
56
+ }`
57
+ }
58
+ builder
59
+ .comment(`extension ${extensionName} installation command`)
60
+ .run(runCommand.trim())
41
61
  }
42
- builder
43
- .comment(`extension ${extensionName} installation command`)
44
- .run(runCommand.trim());
45
- };
46
62
 
47
63
  /**
48
64
  * @param {import('../../../typings/context').ListrContext} ctx
49
65
  * @param {{ image: string, tag: string}} param1
50
66
  */
51
67
  const buildDockerFileInstructions = async (ctx, { image, tag }) => {
52
- const { composer } = ctx.config.overridenConfiguration.configuration;
53
- const existingPHPExtensions = await getEnabledExtensionsFromImage(`${image}:${tag}`);
54
- const imageDetails = await imageApi.inspect({ image: `${image}:${tag}`, formatToJSON: true });
68
+ const { composer } = ctx.config.overridenConfiguration.configuration
69
+ const existingPHPExtensions = await getEnabledExtensionsFromImage(
70
+ `${image}:${tag}`
71
+ )
72
+ const imageDetails = await imageApi.inspect({
73
+ image: `${image}:${tag}`,
74
+ formatToJSON: true
75
+ })
55
76
 
56
77
  const missingExtensions = Object.entries(
57
78
  ctx.config.overridenConfiguration.configuration.php.extensions
58
- ).filter(
59
- ([extensionName, extensionInstructions]) => !Object.entries(existingPHPExtensions)
60
- .map(([n, i]) => [n.toLowerCase(), i])
61
- .some(
62
- ([n]) => extensionName === n || (
63
- extensionInstructions.alternativeName && extensionInstructions.alternativeName.map(
64
- (s) => s.toLowerCase()
65
- ).includes(n)
66
- )
67
- )
68
- ).filter(([extensionName]) => extensionName.toLowerCase() !== 'xdebug');
79
+ )
80
+ .filter(
81
+ ([extensionName, extensionInstructions]) =>
82
+ !Object.entries(existingPHPExtensions)
83
+ .map(([n, i]) => [n.toLowerCase(), i])
84
+ .some(
85
+ ([n]) =>
86
+ extensionName === n ||
87
+ (extensionInstructions.alternativeName &&
88
+ extensionInstructions.alternativeName
89
+ .map((s) => s.toLowerCase())
90
+ .includes(n))
91
+ )
92
+ )
93
+ .filter(([extensionName]) => extensionName.toLowerCase() !== 'xdebug')
69
94
 
70
95
  const dockerFileInstructions = new DockerFileBuilder()
71
96
  .comment('project image')
72
- .from({ image, tag });
97
+ .from({ image, tag })
73
98
 
74
99
  if (missingExtensions.length > 0) {
75
- const allDependencies = missingExtensions.map(
76
- ([_extensionName, extensionInstructions]) => (extensionInstructions.dependencies || [])
77
- )
78
- .reduce((acc, val) => acc.concat(val.filter((ex) => !acc.includes(ex))), []);
100
+ const allDependencies = missingExtensions
101
+ .map(
102
+ ([_extensionName, extensionInstructions]) =>
103
+ extensionInstructions.dependencies || []
104
+ )
105
+ .reduce(
106
+ (acc, val) => acc.concat(val.filter((ex) => !acc.includes(ex))),
107
+ []
108
+ )
79
109
 
80
- dockerFileInstructions.run(`apk add --no-cache ${allDependencies.join(' ')}`);
110
+ dockerFileInstructions.run(
111
+ `apk add --no-cache ${allDependencies.join(' ')}`
112
+ )
81
113
  for (const missingExtensionInstructions of missingExtensions) {
82
- await addExtensionToBuilder(dockerFileInstructions, ctx)(missingExtensionInstructions);
114
+ await addExtensionToBuilder(
115
+ dockerFileInstructions,
116
+ ctx
117
+ )(missingExtensionInstructions)
83
118
  }
84
119
  }
85
120
 
86
121
  const composerVersion = /^\d$/.test(composer.version)
87
122
  ? `latest-${composer.version}.x`
88
- : composer.version;
123
+ : composer.version
89
124
 
90
125
  dockerFileInstructions
91
126
  .comment('download composer')
92
- .run(`curl https://getcomposer.org/download/${composerVersion}/composer.phar --output composer`)
127
+ .run(
128
+ `curl https://getcomposer.org/download/${composerVersion}/composer.phar --output composer`
129
+ )
93
130
  .comment('make composer executable')
94
131
  .run('chmod +x ./composer')
95
132
  .comment('move composer to bin directory')
@@ -98,95 +135,141 @@ const buildDockerFileInstructions = async (ctx, { image, tag }) => {
98
135
  .env({
99
136
  COMPOSER_HOME: '/composer/home',
100
137
  COMPOSER_CACHE_DIR: '/composer/home/cache'
101
- });
138
+ })
102
139
 
103
140
  if (composer.plugins && Object.values(composer.plugins).length > 0) {
104
- for (const [pluginName, pluginOptions] of Object.entries(composer.plugins)) {
141
+ for (const [pluginName, pluginOptions] of Object.entries(
142
+ composer.plugins
143
+ )) {
105
144
  if (pluginOptions.enabled) {
106
145
  dockerFileInstructions
107
146
  .comment(`install ${pluginName} composer global package`)
108
- // eslint-disable-next-line max-len
109
- .run(`composer global require ${pluginName}${ pluginOptions.options ? ` ${pluginOptions.options}` : '' }${ pluginOptions.options ? ` ${pluginOptions.options}` : ''}`);
147
+
148
+ .run(
149
+ `composer global require ${pluginName}${
150
+ pluginOptions.options
151
+ ? ` ${pluginOptions.options}`
152
+ : ''
153
+ }${
154
+ pluginOptions.options
155
+ ? ` ${pluginOptions.options}`
156
+ : ''
157
+ }`
158
+ )
110
159
  }
111
160
  }
112
161
  }
113
162
 
114
163
  if (!ctx.isDockerDesktop) {
115
- dockerFileInstructions
116
- .run(`chown -R ${os.userInfo().uid}:${os.userInfo().gid} /composer/home`);
164
+ dockerFileInstructions.run(
165
+ `chown -R ${os.userInfo().uid}:${os.userInfo().gid} /composer/home`
166
+ )
117
167
  }
118
168
 
119
- dockerFileInstructions
120
- .workDir(ctx.config.baseConfig.containerMagentoDir);
169
+ dockerFileInstructions.workDir(ctx.config.baseConfig.containerMagentoDir)
121
170
 
122
- const imagePathEnv = imageDetails.Config.Env.find((env) => env.startsWith('PATH'));
123
- const magentoBinDir = path.join(ctx.config.baseConfig.containerMagentoDir, 'bin');
124
- const vendorBinDir = path.join(ctx.config.baseConfig.containerMagentoDir, 'vendor', 'bin');
171
+ const imagePathEnv = imageDetails.Config.Env.find((env) =>
172
+ env.startsWith('PATH')
173
+ )
174
+ const magentoBinDir = path.join(
175
+ ctx.config.baseConfig.containerMagentoDir,
176
+ 'bin'
177
+ )
178
+ const vendorBinDir = path.join(
179
+ ctx.config.baseConfig.containerMagentoDir,
180
+ 'vendor',
181
+ 'bin'
182
+ )
125
183
 
126
- dockerFileInstructions
127
- .env({
128
- PATH: `${ imagePathEnv.split('=').pop() }:${ magentoBinDir }:${vendorBinDir }`
129
- });
184
+ if (imagePathEnv) {
185
+ dockerFileInstructions.env({
186
+ PATH: `${imagePathEnv
187
+ .split('=')
188
+ .pop()}:${magentoBinDir}:${vendorBinDir}`
189
+ })
190
+ }
130
191
 
131
- return dockerFileInstructions;
132
- };
192
+ return dockerFileInstructions
193
+ }
133
194
 
134
195
  /**
135
- * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
196
+ * @returns {import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
136
197
  */
137
198
  const buildProjectImage = () => ({
138
199
  title: 'Building Project Image',
139
200
  task: async (ctx, task) => {
140
- const containers = ctx.config.docker.getContainers(ctx.ports);
141
- const [image, tag = 'latest'] = ctx.config.overridenConfiguration.configuration.php.baseImage.split(':');
142
- const dockerFileInstructions = await buildDockerFileInstructions(ctx, { image, tag });
201
+ const containers = ctx.config.docker.getContainers(ctx.ports)
202
+ const [image, tag = 'latest'] =
203
+ ctx.config.overridenConfiguration.configuration.php.baseImage.split(
204
+ ':'
205
+ )
206
+ const dockerFileInstructions = await buildDockerFileInstructions(ctx, {
207
+ image,
208
+ tag
209
+ })
143
210
 
144
211
  try {
145
- await execAsyncSpawn(`docker build -t ${containers.php.image} -<<EOF
212
+ await execAsyncSpawn(
213
+ `docker build -t ${containers.php.image} -<<EOF
146
214
  ${dockerFileInstructions.build()}
147
- EOF`, {
148
- callback: (r) => {
149
- task.output = r;
215
+ EOF`,
216
+ {
217
+ callback: (r) => {
218
+ task.output = r
219
+ }
150
220
  }
151
- });
221
+ )
152
222
  } catch (e) {
153
- throw new KnownError(`Unexpected error during project image building!\n\n${e}`);
223
+ throw new KnownError(
224
+ `Unexpected error during project image building!\n\n${e}`
225
+ )
154
226
  }
155
227
  },
156
228
  options: {
157
229
  bottomBar: 10
158
230
  }
159
- });
231
+ })
160
232
 
161
233
  /**
162
- * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
234
+ * @returns {import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
163
235
  */
164
236
  const buildDebugProjectImage = () => ({
165
237
  title: 'Building Debug Project Image',
166
238
  task: async (ctx, task) => {
167
- const containers = ctx.config.docker.getContainers(ctx.ports);
168
- const [image, tag = 'latest'] = ctx.config.overridenConfiguration.configuration.php.debugImage.split(':');
169
- const dockerFileInstructions = await buildDockerFileInstructions(ctx, { image, tag });
239
+ const containers = ctx.config.docker.getContainers(ctx.ports)
240
+ const [image, tag = 'latest'] =
241
+ ctx.config.overridenConfiguration.configuration.php.debugImage.split(
242
+ ':'
243
+ )
244
+ const dockerFileInstructions = await buildDockerFileInstructions(ctx, {
245
+ image,
246
+ tag
247
+ })
170
248
 
171
249
  try {
172
- await execAsyncSpawn(`docker build -t ${containers.php.debugImage} -<<EOF
250
+ await execAsyncSpawn(
251
+ `docker build -t ${containers.php.debugImage} -<<EOF
173
252
  ${dockerFileInstructions.build()}
174
- EOF`, {
175
- callback: (r) => {
176
- task.output = r;
253
+ EOF`,
254
+ {
255
+ callback: (r) => {
256
+ task.output = r
257
+ }
177
258
  }
178
- });
259
+ )
179
260
  } catch (e) {
180
- throw new KnownError(`Unexpected error during debug project image building!\n\n${e}`);
261
+ throw new KnownError(
262
+ `Unexpected error during debug project image building!\n\n${e}`
263
+ )
181
264
  }
182
265
  },
183
266
  options: {
184
267
  bottomBar: 10
185
268
  }
186
- });
269
+ })
187
270
 
188
271
  module.exports = {
189
272
  buildProjectImage,
190
273
  buildDebugProjectImage,
191
274
  getEnabledExtensionsFromImage
192
- };
275
+ }
@@ -1,5 +1,5 @@
1
- const systemApi = require('./system-api');
1
+ const systemApi = require('./system-api')
2
2
 
3
3
  module.exports = {
4
4
  systemApi
5
- };
5
+ }
@@ -1,4 +1,4 @@
1
- import { ExecAsyncSpawnOptions } from '../../../util/exec-async-command';
1
+ import { ExecAsyncSpawnOptions } from '../../../util/exec-async-command'
2
2
 
3
3
  export interface SystemDFOptions<T extends boolean = false> {
4
4
  format?: string
@@ -30,7 +30,7 @@ export interface SystemDFResult {
30
30
  Mounts: string
31
31
  Names: string
32
32
  Networks: string
33
- Ports: StreamPipeOptions
33
+ Ports: string
34
34
  RunningFor: string
35
35
  Size: string
36
36
  State: string
@@ -1,35 +1,32 @@
1
- const { execAsyncSpawn } = require('../../../util/exec-async-command');
1
+ const { execAsyncSpawn } = require('../../../util/exec-async-command')
2
2
 
3
3
  /**
4
4
  * @param {import('./system-api').SystemDFOptions} options
5
5
  * @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
6
6
  */
7
7
  const df = async (options, execOptions = {}) => {
8
- const {
9
- format,
10
- formatToJSON,
11
- verbose
12
- } = options;
8
+ const { format, formatToJSON, verbose } = options
13
9
 
14
- const formatArg = !formatToJSON && format
15
- ? `--format=${format}`
16
- : formatToJSON && '--format=\'{{json .}}\'';
17
- const verboseArg = verbose && '--verbose';
10
+ const formatArg =
11
+ !formatToJSON && format
12
+ ? `--format=${format}`
13
+ : formatToJSON && "--format='{{json .}}'"
14
+ const verboseArg = verbose && '--verbose'
18
15
 
19
- const args = [
20
- formatArg,
21
- verboseArg
22
- ].filter(Boolean).join(' ');
16
+ const args = [formatArg, verboseArg].filter(Boolean).join(' ')
23
17
 
24
18
  if (formatToJSON) {
25
- const result = await execAsyncSpawn(`docker system df ${args}`, execOptions);
19
+ const result = await execAsyncSpawn(
20
+ `docker system df ${args}`,
21
+ execOptions
22
+ )
26
23
 
27
- return JSON.parse(result);
24
+ return JSON.parse(result)
28
25
  }
29
26
 
30
- return execAsyncSpawn(`docker system df ${args}`, execOptions);
31
- };
27
+ return execAsyncSpawn(`docker system df ${args}`, execOptions)
28
+ }
32
29
 
33
30
  module.exports = {
34
31
  df
35
- };
32
+ }
@@ -1,9 +1,9 @@
1
- const volumeApi = require('./volume-api');
2
- const { createVolumes, removeVolumes, removeLocalVolumes } = require('./tasks');
1
+ const volumeApi = require('./volume-api')
2
+ const { createVolumes, removeVolumes, removeLocalVolumes } = require('./tasks')
3
3
 
4
4
  module.exports = {
5
5
  createVolumes,
6
6
  removeVolumes,
7
7
  removeLocalVolumes,
8
8
  volumeApi
9
- };
9
+ }
@@ -1,107 +1,124 @@
1
- const fs = require('fs');
2
- const pathExists = require('../../../util/path-exists');
3
- const { containerApi } = require('../containers');
4
- const volumeApi = require('./volume-api');
1
+ const fs = require('fs')
2
+ const pathExists = require('../../../util/path-exists')
3
+ const { containerApi } = require('../containers')
4
+ const volumeApi = require('./volume-api')
5
5
 
6
6
  /**
7
- * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
7
+ * @returns {import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
8
8
  */
9
9
  const createVolumes = () => ({
10
10
  title: 'Creating volumes',
11
11
  task: async ({ config: { docker } }, task) => {
12
12
  const volumeList = await volumeApi.ls({
13
13
  formatToJSON: true
14
- });
14
+ })
15
15
 
16
16
  const missingVolumes = Object.values(docker.volumes).filter(
17
17
  ({ name }) => !volumeList.some((v) => v.Name === name)
18
- );
18
+ )
19
19
 
20
20
  if (missingVolumes.length === 0) {
21
- task.skip();
22
- return;
21
+ task.skip()
22
+ return
23
23
  }
24
24
 
25
- await Promise.all(missingVolumes.map(async (volume) => {
26
- if (volume.opt && volume.opt.device && !await pathExists(volume.opt.device)) {
27
- await fs.promises.mkdir(volume.opt.device, {
28
- recursive: true
29
- });
30
- }
31
- }));
25
+ await Promise.all(
26
+ missingVolumes.map(async (volume) => {
27
+ if (
28
+ volume.opt &&
29
+ volume.opt.device &&
30
+ !(await pathExists(volume.opt.device))
31
+ ) {
32
+ await fs.promises.mkdir(volume.opt.device, {
33
+ recursive: true
34
+ })
35
+ }
36
+ })
37
+ )
32
38
 
33
- await Promise.all(missingVolumes.map((volume) => volumeApi.create(volume)));
39
+ await Promise.all(
40
+ missingVolumes.map((volume) => volumeApi.create(volume))
41
+ )
34
42
  }
35
- });
43
+ })
36
44
 
37
45
  /**
38
- * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
46
+ * @returns {import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
39
47
  */
40
48
  const removeVolumes = () => ({
41
49
  title: 'Removing volumes',
42
50
  task: async ({ config: { docker } }, task) => {
43
51
  const volumeList = await volumeApi.ls({
44
52
  formatToJSON: true
45
- });
53
+ })
46
54
 
47
55
  const deployedVolumes = Object.values(docker.volumes).filter(
48
56
  ({ name }) => volumeList.some((v) => v.Name === name)
49
- );
57
+ )
50
58
 
51
59
  if (deployedVolumes.length === 0) {
52
- task.skip();
53
- return;
60
+ task.skip()
61
+ return
54
62
  }
55
63
 
56
64
  await volumeApi.rm({
57
65
  volumes: deployedVolumes.map(({ name }) => name)
58
- });
66
+ })
59
67
  }
60
- });
68
+ })
61
69
 
62
70
  /**
63
- * @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
71
+ * @returns {import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
64
72
  */
65
73
  const removeLocalVolumes = () => ({
66
74
  title: 'Removing local volumes',
67
75
  task: async (ctx, task) => {
68
76
  const volumeList = await volumeApi.ls({
69
77
  formatToJSON: true
70
- });
71
- const { volumes } = ctx.config.docker;
78
+ })
79
+ const { volumes } = ctx.config.docker
72
80
 
73
81
  const localVolumes = Object.values(volumes).filter(
74
82
  (volume) => volume.opt && volume.opt.device
75
- );
83
+ )
76
84
 
77
- const existingLocalVolumes = localVolumes.filter(
78
- (volume) => volumeList.some((v) => v.Name === volume.name)
79
- );
85
+ const existingLocalVolumes = localVolumes.filter((volume) =>
86
+ volumeList.some((v) => v.Name === volume.name)
87
+ )
80
88
 
81
89
  if (existingLocalVolumes.length > 0) {
82
90
  const existingLocalVolumesDetails = await Promise.all(
83
- existingLocalVolumes.map((v) => volumeApi.inspect({ volume: v.name, formatToJSON: true }))
84
- );
91
+ existingLocalVolumes.map((v) =>
92
+ volumeApi.inspect({ volume: v.name, formatToJSON: true })
93
+ )
94
+ )
85
95
 
86
- await Promise.all(existingLocalVolumesDetails.map(async (v) => {
87
- if (v.Containers && Object.entries(v.Containers).length > 0) {
88
- await Promise.all(Object.values(v.Containers).map(async (c) => {
89
- await containerApi.stop([c.Name]);
90
- await containerApi.rm([c.Name]);
91
- }));
92
- }
93
- }));
96
+ await Promise.all(
97
+ existingLocalVolumesDetails.map(async (v) => {
98
+ if (
99
+ v.Containers &&
100
+ Object.entries(v.Containers).length > 0
101
+ ) {
102
+ await Promise.all(
103
+ Object.values(v.Containers).map(async (c) => {
104
+ await containerApi.stop([c.Name])
105
+ await containerApi.rm([c.Name])
106
+ })
107
+ )
108
+ }
109
+ })
110
+ )
94
111
  await volumeApi.rm({
95
112
  volumes: existingLocalVolumes.map((volume) => volume.name)
96
- });
113
+ })
97
114
  } else {
98
- task.skip();
115
+ task.skip()
99
116
  }
100
117
  }
101
- });
118
+ })
102
119
 
103
120
  module.exports = {
104
121
  createVolumes,
105
122
  removeVolumes,
106
123
  removeLocalVolumes
107
- };
124
+ }
@@ -1,4 +1,4 @@
1
- import { ExecAsyncSpawnOptions } from '../../../util/exec-async-command';
1
+ import { ExecAsyncSpawnOptions } from '../../../util/exec-async-command'
2
2
 
3
3
  export interface VolumeLsOptions<T extends boolean = false> {
4
4
  filter?: string | string[]
@@ -63,10 +63,13 @@ export interface VolumeInspectResult {
63
63
  Options: unknown
64
64
  Scope: string
65
65
  CreatedTime: number
66
- Containers: Record<string, {
67
- Name: string
68
- Destination: string
69
- }>
66
+ Containers: Record<
67
+ string,
68
+ {
69
+ Name: string
70
+ Destination: string
71
+ }
72
+ >
70
73
  }
71
74
 
72
75
  export function inspect(