@scandipwa/magento-scripts 2.0.0-alpha.2 → 2.0.0-alpha.21
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.
- package/exec.js +71 -0
- package/index.js +1 -1
- package/lib/commands/cli.js +18 -1
- package/lib/commands/execute.js +2 -57
- package/lib/commands/logs.js +28 -2
- package/lib/commands/start.js +24 -3
- package/lib/commands/status.js +9 -1
- package/lib/config/config.js +20 -2
- package/lib/config/docker.js +90 -53
- package/lib/config/get-project-configuration.js +5 -0
- package/lib/config/index.js +10 -3
- package/lib/config/php/versions/php-7.2.js +1 -0
- package/lib/config/php/versions/php-7.3.js +1 -0
- package/lib/config/php/versions/php-7.4.js +1 -0
- package/lib/config/php/versions/php-8.1.js +1 -0
- package/lib/config/php-config.js +4 -3
- package/lib/config/port-config.js +3 -1
- package/lib/config/services/composer/versions/composer-1.js +13 -0
- package/lib/config/services/composer/versions/composer-2.js +8 -0
- package/lib/config/services/composer/versions/index.js +4 -0
- package/lib/config/services/maildev/index.js +7 -0
- package/lib/config/services/nginx/versions/index.js +3 -0
- package/lib/config/services/nginx/versions/nginx-1.18.js +11 -0
- package/lib/config/{ssl-terminator → services/ssl-terminator}/index.js +3 -0
- package/lib/config/templates/magentorc.template +12 -5
- package/lib/config/templates/php-debug.template.ini +31 -0
- package/lib/config/templates/php-fpm.template.conf +1 -2
- package/lib/config/templates/php.template.ini +5 -201
- package/lib/config/templates/ssl-terminator.template.conf +10 -3
- package/lib/config/templates/varnish.template.vcl +20 -13
- package/lib/config/varnish/varnish-6-0.js +4 -0
- package/lib/config/varnish/varnish-6-6.js +4 -0
- package/lib/config/varnish/varnish-7-0.js +4 -0
- package/lib/config/versions/magento-2.2.10.js +41 -0
- package/lib/config/versions/magento-2.3.0.js +8 -10
- package/lib/config/versions/magento-2.3.1.js +8 -10
- package/lib/config/versions/magento-2.3.2-p1.js +8 -10
- package/lib/config/versions/magento-2.3.2-p2.js +8 -10
- package/lib/config/versions/magento-2.3.2.js +8 -10
- package/lib/config/versions/magento-2.3.3-p1.js +8 -10
- package/lib/config/versions/magento-2.3.3.js +8 -10
- package/lib/config/versions/magento-2.3.4-p1.js +8 -10
- package/lib/config/versions/magento-2.3.4-p2.js +8 -10
- package/lib/config/versions/magento-2.3.4.js +8 -10
- package/lib/config/versions/magento-2.3.5-p1.js +8 -10
- package/lib/config/versions/magento-2.3.5-p2.js +8 -10
- package/lib/config/versions/magento-2.3.5.js +8 -10
- package/lib/config/versions/magento-2.3.6-p1.js +8 -10
- package/lib/config/versions/magento-2.3.6.js +8 -10
- package/lib/config/versions/magento-2.3.7-p1.js +8 -10
- package/lib/config/versions/magento-2.3.7-p2.js +8 -10
- package/lib/config/versions/magento-2.3.7-p3.js +8 -10
- package/lib/config/versions/magento-2.3.7-p4.js +42 -0
- package/lib/config/versions/magento-2.3.7.js +8 -10
- package/lib/config/versions/magento-2.4.0-p1.js +8 -10
- package/lib/config/versions/magento-2.4.0.js +8 -10
- package/lib/config/versions/magento-2.4.1-p1.js +8 -10
- package/lib/config/versions/magento-2.4.1.js +8 -10
- package/lib/config/versions/magento-2.4.2-p1.js +8 -10
- package/lib/config/versions/magento-2.4.2-p2.js +8 -10
- package/lib/config/versions/magento-2.4.2.js +8 -10
- package/lib/config/versions/magento-2.4.3-p1.js +8 -10
- package/lib/config/versions/magento-2.4.3-p2.js +8 -10
- package/lib/config/versions/magento-2.4.3-p3.js +44 -0
- package/lib/config/versions/magento-2.4.3.js +8 -10
- package/lib/config/versions/magento-2.4.4-p1.js +44 -0
- package/lib/config/versions/magento-2.4.4.js +8 -10
- package/lib/config/versions/magento-2.4.5.js +44 -0
- package/lib/tasks/cli/create-bashrc-config.js +4 -2
- package/lib/tasks/composer/local-auth-json.js +1 -1
- package/lib/tasks/database/connect-to-database.js +6 -3
- package/lib/tasks/database/create-magento-database.js +5 -2
- package/lib/tasks/database/create-magento-user.js +50 -0
- package/lib/tasks/database/default-magento-database.js +3 -0
- package/lib/tasks/database/default-magento-user.js +7 -0
- package/lib/tasks/database/import-dump-to-database.js +3 -2
- package/lib/tasks/docker/api.d.ts +25 -1
- package/lib/tasks/docker/api.js +31 -1
- package/lib/tasks/docker/containers/container-api.d.ts +21 -0
- package/lib/tasks/docker/containers/container-api.js +82 -17
- package/lib/tasks/docker/containers/tasks.js +44 -13
- package/lib/tasks/docker/convert-composer-home-to-composer-cache-volume.js +52 -0
- package/lib/tasks/docker/convert-mysql-to-mariadb.js +2 -2
- package/lib/tasks/docker/image/image-api.d.ts +44 -0
- package/lib/tasks/docker/image/image-api.js +30 -2
- package/lib/tasks/docker/index.js +6 -1
- package/lib/tasks/docker/project-image-builder.js +37 -14
- package/lib/tasks/docker/system/index.js +5 -0
- package/lib/tasks/docker/system/system-api.d.ts +71 -0
- package/lib/tasks/docker/system/system-api.js +29 -0
- package/lib/tasks/docker/volume/index.js +2 -1
- package/lib/tasks/docker/volume/tasks.js +67 -9
- package/lib/tasks/docker/volume/volume-api.d.ts +40 -0
- package/lib/tasks/docker/volume/volume-api.js +54 -1
- package/lib/tasks/execute.js +100 -0
- package/lib/tasks/file-system/create-nginx-config.js +3 -5
- package/lib/tasks/file-system/create-php-config.js +2 -23
- package/lib/tasks/file-system/create-php-debug-config.js +45 -0
- package/lib/tasks/file-system/create-php-fpm-config.js +2 -4
- package/lib/tasks/file-system/create-phpstorm-config/exclude-folder-config.js +13 -3
- package/lib/tasks/file-system/create-phpstorm-config/index.js +2 -1
- package/lib/tasks/file-system/create-phpstorm-config/workspace-config/php-workspace-project-configuration-config.js +1 -1
- package/lib/tasks/file-system/create-ssl-terminator-config.js +4 -7
- package/lib/tasks/file-system/create-varnish-config.js +4 -7
- package/lib/tasks/file-system/create-vscode-config.js +2 -1
- package/lib/tasks/file-system/index.js +3 -2
- package/lib/tasks/magento/enable-magento-composer-plugins.js +85 -30
- package/lib/tasks/magento/install-magento-project.js +3 -2
- package/lib/tasks/magento/setup-magento/configure-elasticsearch.js +2 -4
- package/lib/tasks/magento/setup-magento/flush-redis-config.js +3 -6
- package/lib/tasks/magento/setup-magento/index.js +2 -0
- package/lib/tasks/magento/setup-magento/install-magento.js +8 -13
- package/lib/tasks/magento/setup-magento/set-base-url.js +1 -1
- package/lib/tasks/magento/setup-magento/set-mail-config.js +22 -0
- package/lib/tasks/magento/setup-magento/varnish-config.js +4 -9
- package/lib/tasks/magento/setup-magento/waiting-for-varnish.js +17 -16
- package/lib/tasks/php/php-container.js +7 -3
- package/lib/tasks/php/update-env-php.js +3 -4
- package/lib/tasks/{prefix → project-config}/index.js +6 -6
- package/lib/tasks/requirements/composer-credentials.js +7 -3
- package/lib/tasks/requirements/docker/context.js +88 -0
- package/lib/tasks/requirements/docker/index.js +114 -20
- package/lib/tasks/requirements/docker/install.js +21 -7
- package/lib/tasks/requirements/docker/permissions.js +2 -11
- package/lib/tasks/requirements/docker/running-status.js +94 -24
- package/lib/tasks/requirements/docker/version.js +1 -0
- package/lib/tasks/requirements/index.js +0 -2
- package/lib/tasks/requirements/php-version.js +4 -2
- package/lib/tasks/start.js +27 -8
- package/lib/tasks/status/index.js +60 -21
- package/lib/tasks/stop.js +2 -0
- package/lib/tasks/theme/retrieve-theme-data.js +12 -2
- package/lib/util/config-file-validator.js +17 -3
- package/lib/util/execute-in-container.js +62 -0
- package/lib/util/instance-metadata.js +14 -2
- package/lib/util/systemctl.js +62 -13
- package/package.json +4 -3
- package/typings/context.d.ts +11 -0
- package/typings/index.d.ts +46 -1
- package/lib/tasks/execute/index.js +0 -26
- package/lib/tasks/requirements/dependency/arch.js +0 -50
- package/lib/tasks/requirements/dependency/centos.js +0 -36
- package/lib/tasks/requirements/dependency/fedora.js +0 -36
- package/lib/tasks/requirements/dependency/index.js +0 -33
- package/lib/tasks/requirements/dependency/mac.js +0 -124
- package/lib/tasks/requirements/dependency/ubuntu.js +0 -83
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ExecAsyncSpawnOptions } from '../../../util/exec-async-command';
|
|
2
|
+
|
|
3
|
+
export interface SystemDFOptions<T extends boolean = false> {
|
|
4
|
+
format?: string
|
|
5
|
+
formatToJSON?: T
|
|
6
|
+
verbose?: boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface SystemDFResult {
|
|
10
|
+
Images: {
|
|
11
|
+
Containers: string
|
|
12
|
+
CreatedAt: string
|
|
13
|
+
CreatedSince: string
|
|
14
|
+
Digest: string
|
|
15
|
+
ID: string
|
|
16
|
+
Repository: string
|
|
17
|
+
SharedSize: string
|
|
18
|
+
Size: string
|
|
19
|
+
Tag: string
|
|
20
|
+
UniqueSize: string
|
|
21
|
+
VirtualSize: string
|
|
22
|
+
}[]
|
|
23
|
+
Containers: {
|
|
24
|
+
Command: string
|
|
25
|
+
CreatedAt: string
|
|
26
|
+
ID: string
|
|
27
|
+
Image: string
|
|
28
|
+
Labels: string
|
|
29
|
+
LocalVolumes: string
|
|
30
|
+
Mounts: string
|
|
31
|
+
Names: string
|
|
32
|
+
Networks: string
|
|
33
|
+
Ports: StreamPipeOptions
|
|
34
|
+
RunningFor: string
|
|
35
|
+
Size: string
|
|
36
|
+
State: string
|
|
37
|
+
Status: string
|
|
38
|
+
}[]
|
|
39
|
+
Volumes: {
|
|
40
|
+
Driver: string
|
|
41
|
+
Labels: string
|
|
42
|
+
Links: string
|
|
43
|
+
Mountpoint: string
|
|
44
|
+
Name: string
|
|
45
|
+
Scope: string
|
|
46
|
+
Size: string
|
|
47
|
+
}[]
|
|
48
|
+
BuildCache: {
|
|
49
|
+
CacheType: string
|
|
50
|
+
CreatedAt: string
|
|
51
|
+
CreatedSince: string
|
|
52
|
+
Description: string
|
|
53
|
+
ID: string
|
|
54
|
+
InUse: string
|
|
55
|
+
LastUsedAt: string
|
|
56
|
+
LastUsedSince: string
|
|
57
|
+
Parent: string
|
|
58
|
+
Shared: string
|
|
59
|
+
Size: string
|
|
60
|
+
UsageCount: string
|
|
61
|
+
}[]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function df(
|
|
65
|
+
options?: SystemDFOptions,
|
|
66
|
+
execOptions?: ExecAsyncSpawnOptions<false>
|
|
67
|
+
): Promise<string>
|
|
68
|
+
export function df(
|
|
69
|
+
options?: SystemDFOptions<true>,
|
|
70
|
+
execOptions?: ExecAsyncSpawnOptions<false>
|
|
71
|
+
): Promise<SystemDFResult>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const { execAsyncSpawn } = require('../../../util/exec-async-command');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {import('./system-api').SystemDFOptions} options
|
|
5
|
+
* @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
|
|
6
|
+
*/
|
|
7
|
+
const df = async (options, execOptions = {}) => {
|
|
8
|
+
const {
|
|
9
|
+
format,
|
|
10
|
+
formatToJSON,
|
|
11
|
+
verbose
|
|
12
|
+
} = options;
|
|
13
|
+
|
|
14
|
+
const formatArg = !formatToJSON && format
|
|
15
|
+
? `--format=${format}`
|
|
16
|
+
: formatToJSON && '--format=\'{{json .}}\'';
|
|
17
|
+
const verboseArg = verbose && '--verbose';
|
|
18
|
+
|
|
19
|
+
const args = [
|
|
20
|
+
formatArg,
|
|
21
|
+
verboseArg
|
|
22
|
+
].filter(Boolean).join(' ');
|
|
23
|
+
|
|
24
|
+
return execAsyncSpawn(`docker system df ${args}`, execOptions);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
module.exports = {
|
|
28
|
+
df
|
|
29
|
+
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
const volumeApi = require('./volume-api');
|
|
2
|
-
const { createVolumes, removeVolumes } = require('./tasks');
|
|
2
|
+
const { createVolumes, removeVolumes, removeLocalVolumes } = require('./tasks');
|
|
3
3
|
|
|
4
4
|
module.exports = {
|
|
5
5
|
createVolumes,
|
|
6
6
|
removeVolumes,
|
|
7
|
+
removeLocalVolumes,
|
|
7
8
|
volumeApi
|
|
8
9
|
};
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const pathExists = require('../../../util/path-exists');
|
|
3
|
+
const { containerApi } = require('../containers');
|
|
4
|
+
const volumeApi = require('./volume-api');
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
7
|
* @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
|
|
@@ -7,10 +9,12 @@ const { create } = require('./volume-api');
|
|
|
7
9
|
const createVolumes = () => ({
|
|
8
10
|
title: 'Creating volumes',
|
|
9
11
|
task: async ({ config: { docker } }, task) => {
|
|
10
|
-
const volumeList =
|
|
12
|
+
const volumeList = await volumeApi.ls({
|
|
13
|
+
formatToJSON: true
|
|
14
|
+
});
|
|
11
15
|
|
|
12
16
|
const missingVolumes = Object.values(docker.volumes).filter(
|
|
13
|
-
({ name }) => !volumeList.
|
|
17
|
+
({ name }) => !volumeList.some((v) => v.Name === name)
|
|
14
18
|
);
|
|
15
19
|
|
|
16
20
|
if (missingVolumes.length === 0) {
|
|
@@ -18,7 +22,15 @@ const createVolumes = () => ({
|
|
|
18
22
|
return;
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
await Promise.all(missingVolumes.map((volume) =>
|
|
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
|
+
}));
|
|
32
|
+
|
|
33
|
+
await Promise.all(missingVolumes.map((volume) => volumeApi.create(volume)));
|
|
22
34
|
}
|
|
23
35
|
});
|
|
24
36
|
|
|
@@ -28,10 +40,12 @@ const createVolumes = () => ({
|
|
|
28
40
|
const removeVolumes = () => ({
|
|
29
41
|
title: 'Removing volumes',
|
|
30
42
|
task: async ({ config: { docker } }, task) => {
|
|
31
|
-
const volumeList =
|
|
43
|
+
const volumeList = await volumeApi.ls({
|
|
44
|
+
formatToJSON: true
|
|
45
|
+
});
|
|
32
46
|
|
|
33
47
|
const deployedVolumes = Object.values(docker.volumes).filter(
|
|
34
|
-
({ name }) => volumeList.
|
|
48
|
+
({ name }) => volumeList.some((v) => v.Name === name)
|
|
35
49
|
);
|
|
36
50
|
|
|
37
51
|
if (deployedVolumes.length === 0) {
|
|
@@ -39,11 +53,55 @@ const removeVolumes = () => ({
|
|
|
39
53
|
return;
|
|
40
54
|
}
|
|
41
55
|
|
|
42
|
-
await
|
|
56
|
+
await volumeApi.rm({
|
|
57
|
+
volumes: deployedVolumes.map(({ name }) => name)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @type {() => import('listr2').ListrTask<import('../../../../typings/context').ListrContext>}
|
|
64
|
+
*/
|
|
65
|
+
const removeLocalVolumes = () => ({
|
|
66
|
+
title: 'Removing local volumes',
|
|
67
|
+
task: async (ctx, task) => {
|
|
68
|
+
const volumeList = await volumeApi.ls({
|
|
69
|
+
formatToJSON: true
|
|
70
|
+
});
|
|
71
|
+
const { volumes } = ctx.config.docker;
|
|
72
|
+
|
|
73
|
+
const localVolumes = Object.values(volumes).filter(
|
|
74
|
+
(volume) => volume.opt && volume.opt.device
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
const existingLocalVolumes = localVolumes.filter(
|
|
78
|
+
(volume) => volumeList.some((v) => v.Name === volume.name)
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
if (existingLocalVolumes.length > 0) {
|
|
82
|
+
const existingLocalVolumesDetails = await Promise.all(
|
|
83
|
+
existingLocalVolumes.map((v) => volumeApi.inspect({ volume: v.name, formatToJSON: true }))
|
|
84
|
+
);
|
|
85
|
+
|
|
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
|
+
}));
|
|
94
|
+
await volumeApi.rm({
|
|
95
|
+
volumes: existingLocalVolumes.map((volume) => volume.name)
|
|
96
|
+
});
|
|
97
|
+
} else {
|
|
98
|
+
task.skip();
|
|
99
|
+
}
|
|
43
100
|
}
|
|
44
101
|
});
|
|
45
102
|
|
|
46
103
|
module.exports = {
|
|
47
104
|
createVolumes,
|
|
48
|
-
removeVolumes
|
|
105
|
+
removeVolumes,
|
|
106
|
+
removeLocalVolumes
|
|
49
107
|
};
|
|
@@ -37,3 +37,43 @@ export function create(
|
|
|
37
37
|
options?: VolumeCreateOptions,
|
|
38
38
|
execOptions?: ExecAsyncSpawnOptions<false>
|
|
39
39
|
): Promise<string>
|
|
40
|
+
|
|
41
|
+
export interface VolumeRmOptions {
|
|
42
|
+
force?: boolean
|
|
43
|
+
volumes: string[]
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function rm(
|
|
47
|
+
options?: VolumeRmOptions,
|
|
48
|
+
execOptions?: ExecAsyncSpawnOptions<false>
|
|
49
|
+
): Promise<string>
|
|
50
|
+
|
|
51
|
+
export interface VolumeInspectOptions<T extends boolean = false> {
|
|
52
|
+
volume: string
|
|
53
|
+
format?: string
|
|
54
|
+
formatToJSON?: T
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface VolumeInspectResult {
|
|
58
|
+
CreatedAt: string
|
|
59
|
+
Driver: string
|
|
60
|
+
Labels: unknown
|
|
61
|
+
Mountpoint: string
|
|
62
|
+
Name: string
|
|
63
|
+
Options: unknown
|
|
64
|
+
Scope: string
|
|
65
|
+
CreatedTime: number
|
|
66
|
+
Containers: Record<string, {
|
|
67
|
+
Name: string
|
|
68
|
+
Destination: string
|
|
69
|
+
}>
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function inspect(
|
|
73
|
+
options?: VolumeInspectOptions,
|
|
74
|
+
execOptions?: ExecAsyncSpawnOptions<false>
|
|
75
|
+
): Promise<string>
|
|
76
|
+
export function inspect(
|
|
77
|
+
options?: VolumeInspectOptions<true>,
|
|
78
|
+
execOptions?: ExecAsyncSpawnOptions<false>
|
|
79
|
+
): Promise<VolumeInspectResult>
|
|
@@ -60,7 +60,60 @@ const ls = async (options, execOptions = {}) => {
|
|
|
60
60
|
return execAsyncSpawn(`docker volume ls ${args}`, execOptions);
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* @param {import('./volume-api').VolumeRmOptions} options
|
|
65
|
+
* @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
|
|
66
|
+
*/
|
|
67
|
+
const rm = async (options, execOptions = {}) => {
|
|
68
|
+
const {
|
|
69
|
+
force,
|
|
70
|
+
volumes
|
|
71
|
+
} = options;
|
|
72
|
+
|
|
73
|
+
const forceArg = force && '--force';
|
|
74
|
+
|
|
75
|
+
const command = [
|
|
76
|
+
'docker',
|
|
77
|
+
'volume',
|
|
78
|
+
'rm',
|
|
79
|
+
forceArg,
|
|
80
|
+
...volumes
|
|
81
|
+
].filter(Boolean).join(' ');
|
|
82
|
+
|
|
83
|
+
return execAsyncSpawn(command, execOptions);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @param {import('./volume-api').VolumeInspectOptions} options
|
|
88
|
+
* @param {import('../../../util/exec-async-command').ExecAsyncSpawnOptions} execOptions
|
|
89
|
+
*/
|
|
90
|
+
const inspect = async (options, execOptions = {}) => {
|
|
91
|
+
const {
|
|
92
|
+
volume,
|
|
93
|
+
format,
|
|
94
|
+
formatToJSON = false
|
|
95
|
+
} = options;
|
|
96
|
+
|
|
97
|
+
const formatArg = !formatToJSON && format
|
|
98
|
+
? `--format=${format}`
|
|
99
|
+
: formatToJSON && '--format=\'{{json .}}\'';
|
|
100
|
+
|
|
101
|
+
const args = [
|
|
102
|
+
formatArg,
|
|
103
|
+
volume
|
|
104
|
+
].filter(Boolean).join(' ');
|
|
105
|
+
|
|
106
|
+
if (formatToJSON) {
|
|
107
|
+
const result = await execAsyncSpawn(`docker volume inspect ${args}`, execOptions);
|
|
108
|
+
return JSON.parse(result);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return execAsyncSpawn(`docker volume inspect ${args}`, execOptions);
|
|
112
|
+
};
|
|
113
|
+
|
|
63
114
|
module.exports = {
|
|
64
115
|
create,
|
|
65
|
-
ls
|
|
116
|
+
ls,
|
|
117
|
+
rm,
|
|
118
|
+
inspect
|
|
66
119
|
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const { Listr } = require('listr2');
|
|
2
|
+
const logger = require('@scandipwa/scandipwa-dev-utils/logger');
|
|
3
|
+
const { checkRequirements } = require('./requirements');
|
|
4
|
+
const getMagentoVersionConfig = require('../config/get-magento-version-config');
|
|
5
|
+
const checkConfigurationFile = require('../config/check-configuration-file');
|
|
6
|
+
const getProjectConfiguration = require('../config/get-project-configuration');
|
|
7
|
+
const { getCachedPorts } = require('../config/get-port-config');
|
|
8
|
+
const { executeInContainer, runInContainer } = require('../util/execute-in-container');
|
|
9
|
+
const { containerApi } = require('./docker/containers');
|
|
10
|
+
const dockerNetwork = require('./docker/network');
|
|
11
|
+
const KnownError = require('../errors/known-error');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param {{ containername: string, commands?: string[] }} argv
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
const executeTask = async (argv) => {
|
|
19
|
+
const tasks = new Listr([
|
|
20
|
+
checkRequirements(),
|
|
21
|
+
getMagentoVersionConfig(),
|
|
22
|
+
checkConfigurationFile(),
|
|
23
|
+
getProjectConfiguration(),
|
|
24
|
+
getCachedPorts(),
|
|
25
|
+
dockerNetwork.tasks.createNetwork()
|
|
26
|
+
], {
|
|
27
|
+
concurrent: false,
|
|
28
|
+
exitOnError: true,
|
|
29
|
+
ctx: { throwMagentoVersionMissing: true },
|
|
30
|
+
rendererOptions: { collapse: false, clearOutput: true }
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
let ctx;
|
|
34
|
+
try {
|
|
35
|
+
ctx = await tasks.run();
|
|
36
|
+
} catch (e) {
|
|
37
|
+
logger.error(e.message || e);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const containers = ctx.config.docker.getContainers(ctx.ports);
|
|
41
|
+
const services = Object.keys(containers);
|
|
42
|
+
|
|
43
|
+
if (services.includes(argv.containername) || services.some((service) => service.includes(argv.containername))) {
|
|
44
|
+
/**
|
|
45
|
+
* @type {import('./docker/containers/container-api').ContainerRunOptions}
|
|
46
|
+
*/
|
|
47
|
+
const container = containers[argv.containername]
|
|
48
|
+
? containers[argv.containername]
|
|
49
|
+
: Object.entries(containers).find(([key]) => key.includes(argv.containername))[1];
|
|
50
|
+
|
|
51
|
+
if (argv.commands.length === 0) {
|
|
52
|
+
// if we have default connect command then use it
|
|
53
|
+
if (container.connectCommand) {
|
|
54
|
+
// eslint-disable-next-line no-param-reassign
|
|
55
|
+
argv.commands = container.connectCommand;
|
|
56
|
+
} else {
|
|
57
|
+
// otherwise fall back to bash (if it exists inside container)
|
|
58
|
+
argv.commands.push('bash');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const containerList = await containerApi.ls({
|
|
63
|
+
formatToJSON: true,
|
|
64
|
+
all: true,
|
|
65
|
+
filter: `name=${container.name}`
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
if (containerList.length > 0) {
|
|
69
|
+
logger.logN(`Executing container ${logger.style.misc(container._)} (command: ${logger.style.command(argv.commands.join(' '))})`);
|
|
70
|
+
const result = await executeInContainer({
|
|
71
|
+
containerName: container.name,
|
|
72
|
+
commands: argv.commands,
|
|
73
|
+
user: container.user
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (container.name.endsWith('php')) {
|
|
80
|
+
logger.logN(`Starting container ${logger.style.misc(container._)} with command: ${logger.style.command(argv.commands.join(' '))}`);
|
|
81
|
+
const result = await runInContainer(
|
|
82
|
+
{
|
|
83
|
+
...container,
|
|
84
|
+
name: `${container.name}_exec-${Date.now()}`
|
|
85
|
+
},
|
|
86
|
+
argv.commands
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
throw new KnownError(`Container ${container.name} is not running!`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
logger.error(`No container found "${argv.containername}"`);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
module.exports = {
|
|
99
|
+
executeTask
|
|
100
|
+
};
|
|
@@ -14,7 +14,7 @@ const createNginxConfig = () => ({
|
|
|
14
14
|
overridenConfiguration,
|
|
15
15
|
baseConfig
|
|
16
16
|
},
|
|
17
|
-
|
|
17
|
+
isDockerDesktop
|
|
18
18
|
} = ctx;
|
|
19
19
|
|
|
20
20
|
const {
|
|
@@ -23,10 +23,8 @@ const createNginxConfig = () => ({
|
|
|
23
23
|
}
|
|
24
24
|
} = overridenConfiguration;
|
|
25
25
|
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const hostMachine = isNativeLinux ? '127.0.0.1' : 'host.docker.internal';
|
|
29
|
-
const hostPort = isNativeLinux ? ports.app : 80;
|
|
26
|
+
const hostMachine = !isDockerDesktop ? '127.0.0.1' : 'host.docker.internal';
|
|
27
|
+
const hostPort = !isDockerDesktop ? ports.app : 80;
|
|
30
28
|
|
|
31
29
|
try {
|
|
32
30
|
await setConfigFile({
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
const semver = require('semver');
|
|
2
1
|
const UnknownError = require('../../errors/unknown-error');
|
|
3
2
|
const setConfigFile = require('../../util/set-config');
|
|
4
|
-
const { getEnabledExtensionsFromImage } = require('../docker/project-image-builder');
|
|
5
3
|
|
|
6
4
|
/**
|
|
7
5
|
* @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
|
|
@@ -9,32 +7,13 @@ const { getEnabledExtensionsFromImage } = require('../docker/project-image-build
|
|
|
9
7
|
const createPhpConfig = () => ({
|
|
10
8
|
title: 'Setting PHP config',
|
|
11
9
|
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';
|
|
10
|
+
const { config: { php } } = ctx;
|
|
26
11
|
|
|
27
12
|
try {
|
|
28
13
|
await setConfigFile({
|
|
29
14
|
configPathname: php.iniPath,
|
|
30
15
|
template: php.iniTemplatePath,
|
|
31
|
-
overwrite: true
|
|
32
|
-
templateArgs: {
|
|
33
|
-
debug,
|
|
34
|
-
mageRoot: baseConfig.containerMagentoDir,
|
|
35
|
-
isXDebug2,
|
|
36
|
-
hostMachine
|
|
37
|
-
}
|
|
16
|
+
overwrite: true
|
|
38
17
|
});
|
|
39
18
|
} catch (e) {
|
|
40
19
|
throw new UnknownError(`Unexpected error accrued during php.ini config creation\n\n${e}`);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const semver = require('semver');
|
|
2
|
+
const UnknownError = require('../../errors/unknown-error');
|
|
3
|
+
const setConfigFile = require('../../util/set-config');
|
|
4
|
+
const { getEnabledExtensionsFromImage } = require('../docker/project-image-builder');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @type {() => import('listr2').ListrTask<import('../../../typings/context').ListrContext>}
|
|
8
|
+
*/
|
|
9
|
+
const createPhpDebugConfig = () => ({
|
|
10
|
+
title: 'Setting PHP XDebug config',
|
|
11
|
+
skip: (ctx) => !ctx.debug,
|
|
12
|
+
task: async (ctx) => {
|
|
13
|
+
const {
|
|
14
|
+
config: {
|
|
15
|
+
php,
|
|
16
|
+
baseConfig
|
|
17
|
+
},
|
|
18
|
+
debug,
|
|
19
|
+
isDockerDesktop
|
|
20
|
+
} = ctx;
|
|
21
|
+
const containers = ctx.config.docker.getContainers(ctx.ports);
|
|
22
|
+
const phpExtensions = await getEnabledExtensionsFromImage(containers.php.debugImage);
|
|
23
|
+
const isXDebug2 = semver.satisfies(phpExtensions.xdebug, '2');
|
|
24
|
+
|
|
25
|
+
const hostMachine = !isDockerDesktop ? '127.0.0.1' : 'host.docker.internal';
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
await setConfigFile({
|
|
29
|
+
configPathname: php.debugIniPath,
|
|
30
|
+
template: php.debugTemplatePath,
|
|
31
|
+
overwrite: true,
|
|
32
|
+
templateArgs: {
|
|
33
|
+
debug,
|
|
34
|
+
mageRoot: baseConfig.containerMagentoDir,
|
|
35
|
+
isXDebug2,
|
|
36
|
+
hostMachine
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
} catch (e) {
|
|
40
|
+
throw new UnknownError(`Unexpected error accrued during xdebug.ini config creation\n\n${e}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
module.exports = createPhpDebugConfig;
|
|
@@ -7,10 +7,8 @@ const setConfigFile = require('../../util/set-config');
|
|
|
7
7
|
const createPhpFpmConfig = () => ({
|
|
8
8
|
title: 'Setting php-fpm config',
|
|
9
9
|
task: async (ctx) => {
|
|
10
|
-
const { config: { php } } = ctx;
|
|
11
|
-
const
|
|
12
|
-
const isNativeLinux = isLinux && !ctx.isWsl;
|
|
13
|
-
const port = isNativeLinux ? ctx.ports.fpm : 9000;
|
|
10
|
+
const { config: { php }, isDockerDesktop } = ctx;
|
|
11
|
+
const port = !isDockerDesktop ? ctx.ports.fpm : 9000;
|
|
14
12
|
|
|
15
13
|
try {
|
|
16
14
|
await setConfigFile({
|
|
@@ -26,11 +26,21 @@ const mustBeIncludedPaths = [
|
|
|
26
26
|
/**
|
|
27
27
|
* Will retrieve project config file path from module.xml
|
|
28
28
|
*
|
|
29
|
-
* @returns {Promise<String>}
|
|
29
|
+
* @returns {Promise<String | null>}
|
|
30
30
|
*/
|
|
31
31
|
const getProjectConfigFilePath = async () => {
|
|
32
32
|
const modulesConfigData = await loadXmlFile(pathToModulesConfig);
|
|
33
|
-
|
|
33
|
+
const {
|
|
34
|
+
project: {
|
|
35
|
+
component: {
|
|
36
|
+
modules: {
|
|
37
|
+
module
|
|
38
|
+
} = {}
|
|
39
|
+
} = {}
|
|
40
|
+
} = {}
|
|
41
|
+
} = modulesConfigData || {};
|
|
42
|
+
const filePath = module && module['@_filepath'];
|
|
43
|
+
return filePath ? filePath.replace('$PROJECT_DIR$', process.cwd()) : null;
|
|
34
44
|
};
|
|
35
45
|
|
|
36
46
|
const setupDefaultsForExcludedFoldersConfig = (projectConfigData) => {
|
|
@@ -138,7 +148,7 @@ const setupExcludedFoldersConfig = () => ({
|
|
|
138
148
|
task: async (ctx, task) => {
|
|
139
149
|
if (await pathExists(pathToModulesConfig)) {
|
|
140
150
|
const projectFilePath = await getProjectConfigFilePath();
|
|
141
|
-
if (await pathExists(projectFilePath)) {
|
|
151
|
+
if (projectFilePath && await pathExists(projectFilePath)) {
|
|
142
152
|
const projectConfigData = await loadXmlFile(projectFilePath);
|
|
143
153
|
setupDefaultsForExcludedFoldersConfig(projectConfigData);
|
|
144
154
|
const hasChanges = setupExcludedFolders(projectConfigData);
|
|
@@ -31,7 +31,7 @@ const setupPHPWorkspaceProjectConfiguration = async (workspaceConfigs, ctx) => {
|
|
|
31
31
|
hasChanges = true;
|
|
32
32
|
workspaceConfigs.push({
|
|
33
33
|
[nameKey]: PHP_WORKSPACE_PROJECT_CONFIGURATION_COMPONENT_NAME,
|
|
34
|
-
[
|
|
34
|
+
[interpreterNameKey]: currentInterpreterImage,
|
|
35
35
|
include_path: []
|
|
36
36
|
});
|
|
37
37
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const os = require('os');
|
|
2
1
|
const path = require('path');
|
|
3
2
|
const fs = require('fs');
|
|
4
3
|
const setConfigFile = require('../../util/set-config');
|
|
@@ -19,8 +18,8 @@ const createSSLTerminatorConfig = () => ({
|
|
|
19
18
|
overridenConfiguration,
|
|
20
19
|
baseConfig
|
|
21
20
|
},
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
debug,
|
|
22
|
+
isDockerDesktop
|
|
24
23
|
} = ctx;
|
|
25
24
|
|
|
26
25
|
const {
|
|
@@ -65,10 +64,8 @@ const createSSLTerminatorConfig = () => ({
|
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
const networkToBindTo = isIpAddress(host) ? host : '127.0.0.1';
|
|
68
|
-
const
|
|
69
|
-
const
|
|
70
|
-
const hostMachine = isNativeLinux ? '127.0.0.1' : 'host.docker.internal';
|
|
71
|
-
const hostPort = isNativeLinux ? ports.sslTerminator : 80;
|
|
67
|
+
const hostMachine = !isDockerDesktop ? '127.0.0.1' : 'host.docker.internal';
|
|
68
|
+
const hostPort = !isDockerDesktop ? ports.sslTerminator : 80;
|
|
72
69
|
|
|
73
70
|
try {
|
|
74
71
|
await setConfigFile({
|
|
@@ -17,8 +17,7 @@ const createVarnishConfig = () => ({
|
|
|
17
17
|
cacheDir
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
|
-
|
|
21
|
-
platform
|
|
20
|
+
isDockerDesktop
|
|
22
21
|
} = ctx;
|
|
23
22
|
|
|
24
23
|
const {
|
|
@@ -27,9 +26,6 @@ const createVarnishConfig = () => ({
|
|
|
27
26
|
}
|
|
28
27
|
} = overridenConfiguration;
|
|
29
28
|
|
|
30
|
-
const isLinux = platform === 'linux';
|
|
31
|
-
const isNativeLinux = isLinux && !isWsl;
|
|
32
|
-
|
|
33
29
|
try {
|
|
34
30
|
await setConfigFile({
|
|
35
31
|
configPathname: path.join(
|
|
@@ -40,8 +36,9 @@ const createVarnishConfig = () => ({
|
|
|
40
36
|
template: varnish.configTemplate,
|
|
41
37
|
overwrite: true,
|
|
42
38
|
templateArgs: {
|
|
43
|
-
hostMachine:
|
|
44
|
-
nginxPort: ports.app
|
|
39
|
+
hostMachine: !isDockerDesktop ? '127.0.0.1' : 'host.docker.internal',
|
|
40
|
+
nginxPort: ports.app,
|
|
41
|
+
healthCheck: varnish.healthCheck
|
|
45
42
|
}
|
|
46
43
|
});
|
|
47
44
|
} catch (e) {
|