@scandipwa/magento-scripts 2.0.0-alpha.10 → 2.0.0-alpha.13

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 (117) hide show
  1. package/lib/commands/cli.js +5 -0
  2. package/lib/commands/start.js +17 -3
  3. package/lib/commands/status.js +9 -1
  4. package/lib/config/config.js +20 -2
  5. package/lib/config/docker.js +43 -44
  6. package/lib/config/index.js +1 -1
  7. package/lib/config/php/versions/php-7.2.js +1 -0
  8. package/lib/config/php/versions/php-7.3.js +1 -0
  9. package/lib/config/php/versions/php-7.4.js +1 -0
  10. package/lib/config/php/versions/php-8.1.js +1 -0
  11. package/lib/config/php-config.js +4 -3
  12. package/lib/config/services/composer/versions/composer-1.js +8 -0
  13. package/lib/config/services/composer/versions/composer-2.js +8 -0
  14. package/lib/config/services/composer/versions/index.js +4 -0
  15. package/lib/config/services/nginx/versions/index.js +3 -0
  16. package/lib/config/services/nginx/versions/nginx-1.18.js +11 -0
  17. package/lib/config/{ssl-terminator → services/ssl-terminator}/index.js +3 -0
  18. package/lib/config/templates/magentorc.template +6 -5
  19. package/lib/config/templates/php-debug.template.ini +31 -0
  20. package/lib/config/templates/php-fpm.template.conf +1 -2
  21. package/lib/config/templates/php.template.ini +5 -201
  22. package/lib/config/templates/ssl-terminator.template.conf +2 -0
  23. package/lib/config/templates/varnish.template.vcl +20 -13
  24. package/lib/config/varnish/varnish-6-0.js +4 -0
  25. package/lib/config/varnish/varnish-6-6.js +4 -0
  26. package/lib/config/varnish/varnish-7-0.js +4 -0
  27. package/lib/config/versions/magento-2.3.0.js +5 -9
  28. package/lib/config/versions/magento-2.3.1.js +5 -9
  29. package/lib/config/versions/magento-2.3.2-p1.js +5 -9
  30. package/lib/config/versions/magento-2.3.2-p2.js +5 -9
  31. package/lib/config/versions/magento-2.3.2.js +5 -9
  32. package/lib/config/versions/magento-2.3.3-p1.js +5 -9
  33. package/lib/config/versions/magento-2.3.3.js +5 -9
  34. package/lib/config/versions/magento-2.3.4-p1.js +5 -9
  35. package/lib/config/versions/magento-2.3.4-p2.js +5 -9
  36. package/lib/config/versions/magento-2.3.4.js +5 -9
  37. package/lib/config/versions/magento-2.3.5-p1.js +5 -9
  38. package/lib/config/versions/magento-2.3.5-p2.js +5 -9
  39. package/lib/config/versions/magento-2.3.5.js +5 -9
  40. package/lib/config/versions/magento-2.3.6-p1.js +5 -9
  41. package/lib/config/versions/magento-2.3.6.js +5 -9
  42. package/lib/config/versions/magento-2.3.7-p1.js +5 -9
  43. package/lib/config/versions/magento-2.3.7-p2.js +5 -9
  44. package/lib/config/versions/magento-2.3.7-p3.js +5 -9
  45. package/lib/config/versions/magento-2.3.7-p4.js +5 -9
  46. package/lib/config/versions/magento-2.3.7.js +5 -9
  47. package/lib/config/versions/magento-2.4.0-p1.js +5 -9
  48. package/lib/config/versions/magento-2.4.0.js +5 -9
  49. package/lib/config/versions/magento-2.4.1-p1.js +5 -9
  50. package/lib/config/versions/magento-2.4.1.js +5 -9
  51. package/lib/config/versions/magento-2.4.2-p1.js +5 -9
  52. package/lib/config/versions/magento-2.4.2-p2.js +5 -9
  53. package/lib/config/versions/magento-2.4.2.js +5 -9
  54. package/lib/config/versions/magento-2.4.3-p1.js +5 -9
  55. package/lib/config/versions/magento-2.4.3-p2.js +5 -9
  56. package/lib/config/versions/magento-2.4.3-p3.js +5 -9
  57. package/lib/config/versions/magento-2.4.3.js +5 -9
  58. package/lib/config/versions/magento-2.4.4-p1.js +5 -9
  59. package/lib/config/versions/magento-2.4.4.js +5 -9
  60. package/lib/config/versions/magento-2.4.5.js +5 -9
  61. package/lib/tasks/composer/local-auth-json.js +1 -1
  62. package/lib/tasks/database/connect-to-database.js +6 -3
  63. package/lib/tasks/database/create-magento-database.js +5 -2
  64. package/lib/tasks/database/create-magento-user.js +50 -0
  65. package/lib/tasks/database/default-magento-database.js +3 -0
  66. package/lib/tasks/database/default-magento-user.js +7 -0
  67. package/lib/tasks/database/import-dump-to-database.js +3 -2
  68. package/lib/tasks/docker/api.d.ts +25 -1
  69. package/lib/tasks/docker/api.js +31 -1
  70. package/lib/tasks/docker/containers/container-api.d.ts +14 -0
  71. package/lib/tasks/docker/containers/container-api.js +50 -1
  72. package/lib/tasks/docker/containers/tasks.js +32 -1
  73. package/lib/tasks/docker/index.js +6 -1
  74. package/lib/tasks/docker/project-image-builder.js +6 -8
  75. package/lib/tasks/docker/volume/index.js +2 -1
  76. package/lib/tasks/docker/volume/tasks.js +54 -9
  77. package/lib/tasks/docker/volume/volume-api.d.ts +10 -0
  78. package/lib/tasks/docker/volume/volume-api.js +25 -1
  79. package/lib/tasks/execute.js +5 -2
  80. package/lib/tasks/file-system/create-nginx-config.js +3 -5
  81. package/lib/tasks/file-system/create-php-config.js +2 -23
  82. package/lib/tasks/file-system/create-php-debug-config.js +45 -0
  83. package/lib/tasks/file-system/create-php-fpm-config.js +2 -4
  84. package/lib/tasks/file-system/create-ssl-terminator-config.js +4 -7
  85. package/lib/tasks/file-system/create-varnish-config.js +4 -7
  86. package/lib/tasks/file-system/index.js +2 -0
  87. package/lib/tasks/magento/setup-magento/configure-elasticsearch.js +2 -4
  88. package/lib/tasks/magento/setup-magento/flush-redis-config.js +3 -6
  89. package/lib/tasks/magento/setup-magento/install-magento.js +8 -10
  90. package/lib/tasks/magento/setup-magento/varnish-config.js +4 -9
  91. package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +15 -16
  92. package/lib/tasks/php/php-container.js +1 -1
  93. package/lib/tasks/php/update-env-php.js +3 -4
  94. package/lib/tasks/requirements/composer-credentials.js +7 -3
  95. package/lib/tasks/requirements/docker/context.js +88 -0
  96. package/lib/tasks/requirements/docker/index.js +107 -18
  97. package/lib/tasks/requirements/docker/install.js +21 -7
  98. package/lib/tasks/requirements/docker/permissions.js +2 -11
  99. package/lib/tasks/requirements/docker/running-status.js +94 -24
  100. package/lib/tasks/requirements/docker/version.js +1 -0
  101. package/lib/tasks/requirements/index.js +0 -2
  102. package/lib/tasks/requirements/php-version.js +4 -2
  103. package/lib/tasks/start.js +27 -6
  104. package/lib/tasks/status/index.js +13 -11
  105. package/lib/tasks/stop.js +2 -0
  106. package/lib/util/config-file-validator.js +2 -0
  107. package/lib/util/execute-in-container.js +3 -3
  108. package/lib/util/systemctl.js +62 -13
  109. package/package.json +2 -2
  110. package/typings/context.d.ts +7 -0
  111. package/typings/index.d.ts +38 -1
  112. package/lib/tasks/requirements/dependency/arch.js +0 -50
  113. package/lib/tasks/requirements/dependency/centos.js +0 -36
  114. package/lib/tasks/requirements/dependency/fedora.js +0 -36
  115. package/lib/tasks/requirements/dependency/index.js +0 -33
  116. package/lib/tasks/requirements/dependency/mac.js +0 -124
  117. package/lib/tasks/requirements/dependency/ubuntu.js +0 -83
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php74 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish66 } = require('../varnish/varnish-6-6');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.3-p1',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-7.4-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.16.3'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish66({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php74 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish66 } = require('../varnish/varnish-6-6');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.3-p2',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-7.4-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.16.3'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish66({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php74 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish66 } = require('../varnish/varnish-6-6');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.3-p3',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-7.4-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.16.3'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish66({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php74 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish66 } = require('../varnish/varnish-6-6');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.3',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-7.4-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.16.3'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish66({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php81 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish70 } = require('../varnish/varnish-7-0');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.4-p1',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-8.1-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.16.3'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish70({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php81 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish70 } = require('../varnish/varnish-7-0');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.4',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-8.1-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.16.3'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish70({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -1,11 +1,12 @@
1
- const path = require('path');
2
1
  const { defaultMagentoConfig } = require('../magento-config');
3
2
  const sodium = require('../php/extensions/sodium');
4
3
  const { magento24PHPExtensionList } = require('../magento/required-php-extensions');
5
4
  const { php81 } = require('../php/versions');
6
- const { sslTerminator } = require('../ssl-terminator');
5
+ const { sslTerminator } = require('../services/ssl-terminator');
7
6
  const { varnish70 } = require('../varnish/varnish-7-0');
8
7
  const { repo } = require('../php/base-repo');
8
+ const { nginx118 } = require('../services/nginx/versions');
9
+ const { composer2 } = require('../services/composer/versions');
9
10
 
10
11
  module.exports = ({ templateDir } = {}) => ({
11
12
  magentoVersion: '2.4.5',
@@ -16,10 +17,7 @@ module.exports = ({ templateDir } = {}) => ({
16
17
  extensions: { ...magento24PHPExtensionList, sodium },
17
18
  baseImage: `${ repo }:php-8.1-magento-2.4`
18
19
  }),
19
- nginx: {
20
- version: '1.18.0',
21
- configTemplate: path.join(templateDir || '', 'nginx.template.conf')
22
- },
20
+ nginx: nginx118({ templateDir }),
23
21
  redis: {
24
22
  version: '6.0'
25
23
  },
@@ -32,9 +30,7 @@ module.exports = ({ templateDir } = {}) => ({
32
30
  elasticsearch: {
33
31
  version: '7.17.5'
34
32
  },
35
- composer: {
36
- version: '2'
37
- },
33
+ composer: composer2(),
38
34
  varnish: varnish70({ templateDir }),
39
35
  sslTerminator: sslTerminator({ templateDir })
40
36
  },
@@ -27,7 +27,7 @@ const localAuthJson = () => ({
27
27
  throw new KnownError(`Your ./auth.json file does not contain the ${ logger.style.misc("{ 'http-basic': { 'repo.magento.com': <> } }") } field.`);
28
28
  }
29
29
 
30
- process.env.COMPOSER_AUTH = localAuthJson;
30
+ process.env.COMPOSER_AUTH = JSON.stringify(JSON.parse(localAuthJson), null, 0);
31
31
  }
32
32
  },
33
33
  options: {
@@ -3,6 +3,8 @@ const UnknownError = require('../../errors/unknown-error');
3
3
  const { execAsyncSpawn } = require('../../util/exec-async-command');
4
4
  const sleep = require('../../util/sleep');
5
5
  const { createMagentoDatabase } = require('./create-magento-database');
6
+ const { createMagentoUser } = require('./create-magento-user');
7
+ const defaultMagentoUser = require('./default-magento-user');
6
8
 
7
9
  /**
8
10
  * @returns {import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -60,9 +62,9 @@ const gettingDatabaseConnection = () => ({
60
62
  const connection = await mysql2.createConnection({
61
63
  host: '127.0.0.1',
62
64
  port: ports.mariadb,
63
- user: mariadb.env.MARIADB_USER,
64
- password: mariadb.env.MARIADB_PASSWORD,
65
- database: mariadb.env.MARIADB_DATABASE
65
+ user: defaultMagentoUser.user,
66
+ password: defaultMagentoUser.password,
67
+ database: 'magento'
66
68
  });
67
69
 
68
70
  ctx.databaseConnection = connection;
@@ -101,6 +103,7 @@ const connectToDatabase = () => ({
101
103
  task: (ctx, task) => task.newListr([
102
104
  waitForDatabaseInitialization(),
103
105
  createMagentoDatabase(),
106
+ createMagentoUser(),
104
107
  terminatingExistingConnection(),
105
108
  gettingDatabaseConnection()
106
109
  ], {
@@ -1,4 +1,4 @@
1
- const { execAsyncSpawn } = require('../../util/exec-async-command');
1
+ const { containerApi } = require('../docker/containers');
2
2
 
3
3
  /**
4
4
  * Will create database 'magento' in MariaDB if it does not exist for some reason
@@ -9,7 +9,10 @@ const createMagentoDatabase = () => ({
9
9
  task: async (ctx, task) => {
10
10
  const { mariadb } = ctx.config.docker.getContainers();
11
11
  task.title = `Creating Magento database in ${ mariadb._ }`;
12
- await execAsyncSpawn(`docker exec ${mariadb.name} mysql -umagento -pmagento -h 127.0.0.1 -e "CREATE DATABASE IF NOT EXISTS magento;"`);
12
+ await containerApi.exec(
13
+ `mysql -uroot -p${ mariadb.env.MARIADB_ROOT_PASSWORD } -h 127.0.0.1 -e "CREATE DATABASE IF NOT EXISTS magento;"`,
14
+ mariadb.name
15
+ );
13
16
  }
14
17
  });
15
18
 
@@ -0,0 +1,50 @@
1
+ const mysql2 = require('mysql2/promise');
2
+ const defaultMagentoUser = require('./default-magento-user');
3
+
4
+ /**
5
+ * @returns {import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
6
+ */
7
+ const createMagentoUser = () => ({
8
+ title: 'Creating Magento user',
9
+ task: async (ctx, task) => {
10
+ const { mariadb } = ctx.config.docker.getContainers();
11
+ const connection = await mysql2.createConnection({
12
+ host: '127.0.0.1',
13
+ port: ctx.ports.mariadb,
14
+ user: 'root',
15
+ password: mariadb.env.MARIADB_ROOT_PASSWORD
16
+ });
17
+
18
+ const result = await connection.query('select Host, User from mysql.user;');
19
+
20
+ if (result.length === 0) {
21
+ task.skip();
22
+ return;
23
+ }
24
+
25
+ const [users] = result;
26
+
27
+ if (users.some((user) => user.User === defaultMagentoUser.user && user.Host === '%')) {
28
+ task.skip();
29
+ return;
30
+ }
31
+
32
+ if (users.some((user) => user.User === defaultMagentoUser.user)) {
33
+ const magentoUser = users.find((user) => user.User === defaultMagentoUser.user);
34
+
35
+ await connection.query(`DROP USER '${ magentoUser.User }'@'${ magentoUser.Host }'`);
36
+ }
37
+
38
+ await connection.query(
39
+ `CREATE USER '${ defaultMagentoUser.user }'@'${ defaultMagentoUser.host }' IDENTIFIED BY '${ defaultMagentoUser.password }';`
40
+ );
41
+ await connection.query(`GRANT ALL PRIVILEGES ON *.* TO '${ defaultMagentoUser.user }'@'${ defaultMagentoUser.host }' WITH GRANT OPTION;`);
42
+ await connection.query('FLUSH PRIVILEGES;');
43
+
44
+ await connection.destroy();
45
+ }
46
+ });
47
+
48
+ module.exports = {
49
+ createMagentoUser
50
+ };
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ defaultMagentoDatabase: 'magento'
3
+ };
@@ -0,0 +1,7 @@
1
+ const defaultMagentoUser = {
2
+ user: 'magento',
3
+ password: 'magento',
4
+ host: '%'
5
+ };
6
+
7
+ module.exports = defaultMagentoUser;
@@ -5,6 +5,7 @@ const UnknownError = require('../../errors/unknown-error');
5
5
  const { execAsyncSpawn, execCommandTask } = require('../../util/exec-async-command');
6
6
  const pathExists = require('../../util/path-exists');
7
7
  const connectToDatabase = require('./connect-to-database');
8
+ const defaultMagentoUser = require('./default-magento-user');
8
9
 
9
10
  /**
10
11
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -88,8 +89,8 @@ const executeImportDumpSQL = () => ({
88
89
  message: `root (${logger.style.command('Probably safest option')})`
89
90
  },
90
91
  {
91
- name: `--user=${mariadb.env.MARIADB_USER} --password=${mariadb.env.MARIADB_PASSWORD}`,
92
- message: `${mariadb.env.MARIADB_USER}`
92
+ name: `--user=${defaultMagentoUser.user} --password=${defaultMagentoUser.password}`,
93
+ message: `${defaultMagentoUser.user}`
93
94
  }
94
95
  ]
95
96
  });
@@ -1,7 +1,6 @@
1
1
  import { ExecAsyncSpawnOptions } from '../../util/exec-async-command';
2
2
 
3
3
  export interface DockerVersionOptions<T extends boolean = false> {
4
- format?: string
5
4
  format?: string
6
5
  formatToJSON?: T
7
6
  }
@@ -69,3 +68,28 @@ export function version(
69
68
  options: DockerVersionOptions<true>,
70
69
  execOptions?: ExecAsyncSpawnOptions<false>
71
70
  ): Promise<DockerVersionResult>
71
+
72
+ export interface DockerContextOptions<T extends boolean = false> {
73
+ format?: string
74
+ formatToJSON?: T
75
+ }
76
+
77
+ export interface DockerContextResult {
78
+ Current: boolean
79
+ Description: string
80
+ DockerEndpoint: string
81
+ KubernetesEndpoint: string
82
+ ContextType: string
83
+ Name: string
84
+ StackOrchestrator: string
85
+ }
86
+
87
+ export function context(
88
+ options: DockerContextOptions,
89
+ execOptions?: ExecAsyncSpawnOptions<false>
90
+ ): Promise<string>
91
+
92
+ export function context(
93
+ options: DockerContextOptions<true>,
94
+ execOptions?: ExecAsyncSpawnOptions<false>
95
+ ): Promise<DockerContextResult[]>
@@ -25,6 +25,36 @@ const version = async (options, execOptions = {}) => {
25
25
  return execAsyncSpawn(`docker version ${args}`, execOptions);
26
26
  };
27
27
 
28
+ /**
29
+ * @param {import('./api').DockerContextOptions} options
30
+ * @param {import('../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
31
+ */
32
+ const context = async (options, execOptions = {}) => {
33
+ const {
34
+ format,
35
+ formatToJSON
36
+ } = options;
37
+
38
+ const formatArg = !formatToJSON && format
39
+ ? `--format=${format}`
40
+ : formatToJSON && '--format=\'{{json .}}\'';
41
+ const args = [
42
+ formatArg
43
+ ].filter(Boolean).join(' ');
44
+
45
+ if (formatToJSON) {
46
+ const result = await execAsyncSpawn(`docker context ls ${args}`, execOptions);
47
+ if (result.startsWith('[')) {
48
+ return JSON.parse(result);
49
+ }
50
+
51
+ return JSON.parse(`[${result.split('\n').join(', ')}]`);
52
+ }
53
+
54
+ return execAsyncSpawn(`docker context ls ${args}`, execOptions);
55
+ };
56
+
28
57
  module.exports = {
29
- version
58
+ version,
59
+ context
30
60
  };
@@ -130,3 +130,17 @@ export interface ContainerRunOptions {
130
130
  export function run(containerOptions: ContainerRunOptions, execOptions?: ExecAsyncSpawnOptions<false>): Promise<false>
131
131
 
132
132
  export function runCommand(options: ContainerRunOptions): string[]
133
+
134
+ export interface ContainerLogsOptions<T = never> {
135
+ name: string
136
+ details?: boolean
137
+ follow?: boolean
138
+ since?: string
139
+ tail?: string
140
+ timestamps?: boolean
141
+ until?: string
142
+ parser?: (line: string) => T
143
+ }
144
+
145
+ export function logs(options?: ContainerLogsOptions, execOptions?: ExecAsyncSpawnOptions<false>): Promise<string>
146
+ export function logs<T>(options?: ContainerLogsOptions<T>, execOptions?: ExecAsyncSpawnOptions<false>): Promise<T[]>
@@ -149,15 +149,64 @@ const ls = async (options = {}, execOptions = {}) => {
149
149
 
150
150
  if (formatToJSON) {
151
151
  const result = await execAsyncSpawn(`docker container ls ${args}`, execOptions);
152
+ if (result.startsWith('[')) {
153
+ return JSON.parse(result);
154
+ }
155
+
152
156
  return JSON.parse(`[${result.split('\n').join(', ')}]`);
153
157
  }
154
158
 
155
159
  return execAsyncSpawn(`docker container ls ${args}`, execOptions);
156
160
  };
157
161
 
162
+ /**
163
+ * @param {import('./container-api').ContainerLogsOptions} options
164
+ * @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions<false>} execOptions
165
+ */
166
+ const logs = async (options = {}, execOptions = {}) => {
167
+ const {
168
+ name,
169
+ details = false,
170
+ follow = false,
171
+ since = '',
172
+ tail = '',
173
+ timestamps = false,
174
+ until = '',
175
+ parser
176
+ } = options;
177
+ const detailsArg = details && '--details';
178
+ const followArg = follow && '--follow';
179
+ const sinceArg = since && `--since=${since}`;
180
+ const tailArg = tail && `--tail=${tail}`;
181
+ const timestampsArg = timestamps && '--timestamps';
182
+ const untilArg = until && `--until=${until}`;
183
+
184
+ const logsCommand = [
185
+ 'docker',
186
+ 'container',
187
+ 'logs',
188
+ detailsArg,
189
+ followArg,
190
+ sinceArg,
191
+ tailArg,
192
+ timestampsArg,
193
+ untilArg,
194
+ name
195
+ ].filter(Boolean).join(' ');
196
+
197
+ if (parser) {
198
+ const result = await execAsyncSpawn(logsCommand, execOptions);
199
+
200
+ return result.split('\n').map((line) => parser(line));
201
+ }
202
+
203
+ return execAsyncSpawn(logsCommand, execOptions);
204
+ };
205
+
158
206
  module.exports = {
159
207
  run,
160
208
  runCommand,
161
209
  exec,
162
- ls
210
+ ls,
211
+ logs
163
212
  };
@@ -26,8 +26,39 @@ const remoteImageReducer = (acc, val) => {
26
26
  */
27
27
  const pullImages = () => ({
28
28
  title: 'Pulling container images',
29
- task: async ({ config: { docker } }, task) => {
29
+ task: async ({ config: { docker }, pullImages }, task) => {
30
30
  const containers = Object.values(docker.getContainers());
31
+
32
+ if (pullImages) {
33
+ return task.newListr(
34
+ containers
35
+ .reduce(remoteImageReducer, [])
36
+ .map((image) => {
37
+ const [repo, tag = 'latest'] = image.split(':');
38
+
39
+ return { repo, tag };
40
+ })
41
+ .reduce(
42
+ (acc, val) => acc.concat(
43
+ acc.some(
44
+ (c) => c.repo === val.repo
45
+ && c.tag === val.tag
46
+ )
47
+ ? []
48
+ : val
49
+ ),
50
+ []
51
+ )
52
+ .map(({ repo, tag }) => ({
53
+ title: `Pulling ${ logger.style.file(`${repo}:${tag}`) } image`,
54
+ task: () => pull(`${repo}:${tag}`)
55
+ })), {
56
+ concurrent: true,
57
+ exitOnError: true
58
+ }
59
+ );
60
+ }
61
+
31
62
  const imagesFilter = containers
32
63
  .reduce(remoteImageReducer, [])
33
64
  .map((image) => `reference='${image}'`);
@@ -1,5 +1,7 @@
1
1
  const containers = require('./containers');
2
2
  const network = require('./network');
3
+ const volume = require('./volume');
4
+ const dockerApi = require('./api');
3
5
 
4
6
  /**
5
7
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
@@ -19,13 +21,16 @@ const startServices = () => ({
19
21
  * @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
20
22
  */
21
23
  const stopServices = () => ({
24
+ title: 'Stopping Docker services',
22
25
  task: (ctx, task) => task.newListr([
23
26
  containers.stopContainers(),
27
+ volume.removeLocalVolumes(),
24
28
  network.tasks.removeNetwork()
25
29
  ])
26
30
  });
27
31
 
28
32
  module.exports = {
29
33
  startServices,
30
- stopServices
34
+ stopServices,
35
+ dockerApi
31
36
  };