@elementor/wp-lite-env 0.0.9 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/release.yml +2 -2
- package/CHANGELOG.md +12 -0
- package/dist/index.d.ts +0 -2
- package/dist/index.js +259 -11
- package/package.json +4 -2
- package/tsconfig.json +6 -5
- package/tsup.build.ts +9 -0
- package/tsup.dev.ts +9 -0
- package/dist/package.json +0 -46
- package/dist/src/config.d.ts +0 -16
- package/dist/src/config.js +0 -23
- package/dist/src/run.d.ts +0 -11
- package/dist/src/run.js +0 -105
- package/dist/src/templates.d.ts +0 -6
- package/dist/src/templates.js +0 -111
package/CHANGELOG.md
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
@@ -1,16 +1,264 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
// src/run.ts
|
4
|
+
import { downAll, run, upAll } from "docker-compose";
|
5
|
+
import path2 from "path";
|
6
|
+
|
7
|
+
// src/config.ts
|
8
|
+
import fs from "fs";
|
9
|
+
var getConfig = (configFilePath2) => {
|
10
|
+
let configFile = {};
|
11
|
+
if (configFilePath2) {
|
12
|
+
configFile = JSON.parse(fs.readFileSync(configFilePath2, "utf8"));
|
13
|
+
}
|
14
|
+
const defaultConfig = {
|
15
|
+
core: "6.7",
|
16
|
+
phpVersion: "8.1",
|
17
|
+
plugins: {},
|
18
|
+
themes: {},
|
19
|
+
mappings: {},
|
20
|
+
config: {}
|
21
|
+
};
|
22
|
+
return {
|
23
|
+
core: configFile.core || defaultConfig.core,
|
24
|
+
phpVersion: configFile.phpVersion || defaultConfig.phpVersion,
|
25
|
+
plugins: configFile.plugins || defaultConfig.plugins,
|
26
|
+
themes: configFile.themes || defaultConfig.themes,
|
27
|
+
mappings: configFile.mappings || defaultConfig.mappings,
|
28
|
+
config: configFile.config || defaultConfig.config
|
29
|
+
};
|
30
|
+
};
|
31
|
+
|
32
|
+
// src/run.ts
|
33
|
+
import fs2 from "fs";
|
34
|
+
|
35
|
+
// src/templates.ts
|
36
|
+
import path from "path";
|
37
|
+
var generateDockerComposeYmlTemplate = (config, basePath, port2, configPath) => {
|
38
|
+
const mappingsStringArray = Object.keys(config.mappings).map((key) => {
|
39
|
+
const value = config.mappings[key];
|
40
|
+
return ` - >-
|
41
|
+
${path.resolve(basePath, value)}:/var/www/html/${key}
|
42
|
+
`;
|
43
|
+
});
|
44
|
+
const pluginsStringArray = Object.keys(config.plugins).map((key) => {
|
45
|
+
const value = config.plugins[key];
|
46
|
+
return ` - >-
|
47
|
+
${path.resolve(basePath, value)}:/var/www/html/wp-content/plugins/${key}
|
48
|
+
`;
|
49
|
+
});
|
50
|
+
const themesStringArray = Object.keys(config.themes).map((key) => {
|
51
|
+
const value = config.themes[key];
|
52
|
+
return ` - >-
|
53
|
+
${path.resolve(basePath, value)}:/var/www/html/wp-content/themes/${key}
|
54
|
+
`;
|
55
|
+
});
|
56
|
+
const wpContent = ` - >-
|
57
|
+
wpcontent:/var/www/html
|
58
|
+
`;
|
59
|
+
const wpConfig = ` - >-
|
60
|
+
${configPath}:/var/www/html/wp-config
|
61
|
+
`;
|
62
|
+
const volumes = mappingsStringArray.concat(pluginsStringArray).concat(themesStringArray).concat([wpContent, wpConfig]).join("");
|
63
|
+
return `services:
|
64
|
+
mysql:
|
65
|
+
image: 'mariadb:lts'
|
66
|
+
ports:
|
67
|
+
- '\${WP_ENV_MYSQL_PORT:-}:3306'
|
68
|
+
environment:
|
69
|
+
MYSQL_ROOT_HOST: '%'
|
70
|
+
MYSQL_ROOT_PASSWORD: password
|
71
|
+
MYSQL_DATABASE: wordpress
|
72
|
+
volumes:
|
73
|
+
- 'mysql:/var/lib/mysql'
|
74
|
+
wordpress:
|
75
|
+
depends_on:
|
76
|
+
- mysql
|
77
|
+
build:
|
78
|
+
context: .
|
79
|
+
dockerfile: WordPress.Dockerfile
|
80
|
+
no_cache: true
|
81
|
+
args: &ref_0
|
82
|
+
HOST_USERNAME: yotams
|
83
|
+
HOST_UID: '502'
|
84
|
+
HOST_GID: '20'
|
85
|
+
ports:
|
86
|
+
- '\${WP_ENV_PORT:-${port2}}:80'
|
87
|
+
environment:
|
88
|
+
APACHE_RUN_USER: '#502'
|
89
|
+
APACHE_RUN_GROUP: '#20'
|
90
|
+
WORDPRESS_DB_USER: root
|
91
|
+
WORDPRESS_DB_PASSWORD: password
|
92
|
+
WORDPRESS_DB_NAME: wordpress
|
93
|
+
volumes: &ref_1
|
94
|
+
${volumes}
|
95
|
+
extra_hosts:
|
96
|
+
- 'host.docker.internal:host-gateway'
|
97
|
+
cli:
|
98
|
+
depends_on:
|
99
|
+
- wordpress
|
100
|
+
build:
|
101
|
+
context: .
|
102
|
+
dockerfile: CLI.Dockerfile
|
103
|
+
args: *ref_0
|
104
|
+
volumes: *ref_1
|
105
|
+
user: '502:20'
|
106
|
+
environment:
|
107
|
+
WORDPRESS_DB_USER: root
|
108
|
+
WORDPRESS_DB_PASSWORD: password
|
109
|
+
WORDPRESS_DB_NAME: wordpress
|
110
|
+
extra_hosts:
|
111
|
+
- 'host.docker.internal:host-gateway'
|
112
|
+
volumes:
|
113
|
+
mysql: {}
|
114
|
+
wpcontent: {}
|
115
|
+
`;
|
116
|
+
};
|
117
|
+
var generateWordPressDockerfileTemplate = (config) => {
|
118
|
+
return `FROM wordpress:${config.core}-php${config.phpVersion}
|
119
|
+
ARG HOST_USERNAME
|
120
|
+
ARG HOST_UID
|
121
|
+
ARG HOST_GID
|
122
|
+
# When the IDs are already in use we can still safely move on.
|
123
|
+
RUN groupadd -o -g $HOST_GID $HOST_USERNAME || true
|
124
|
+
RUN useradd -mlo -u $HOST_UID -g $HOST_GID $HOST_USERNAME || true
|
125
|
+
`;
|
126
|
+
};
|
127
|
+
var generateCliDockerfileTemplate = (config) => {
|
128
|
+
return `FROM wordpress:cli-php${config.phpVersion}
|
129
|
+
ARG HOST_USERNAME
|
130
|
+
ARG HOST_UID
|
131
|
+
ARG HOST_GID
|
132
|
+
# When the IDs are already in use we can still safely move on.
|
133
|
+
RUN addgroup -g $HOST_GID $HOST_USERNAME || true
|
134
|
+
RUN useradd -mlo -u $HOST_UID -g $HOST_GID $HOST_USERNAME || true
|
135
|
+
# RUN adduser -h /home/$HOST_USERNAME -G $( getent group $HOST_GID | cut -d: -f1 ) -u $HOST_UID $HOST_USERNAME || true
|
136
|
+
|
137
|
+
# Have the container sleep infinitely to keep it alive for us to run commands on it.
|
138
|
+
CMD [ "/bin/sh", "-c", "while true; do sleep 2073600; done" ]
|
139
|
+
`;
|
140
|
+
};
|
141
|
+
var generateConfiguration = (config, port2) => {
|
142
|
+
const header = `#!/bin/bash
|
143
|
+
set -eox pipefail
|
144
|
+
`;
|
145
|
+
const configStringArray = Object.keys(config.config).map((key) => {
|
146
|
+
const value = config.config[key];
|
147
|
+
return `wp config set ${key} ${value} --raw`;
|
148
|
+
});
|
149
|
+
const wpCoreInstall = `wp core install --url="http://localhost:${port2}" --title="test" --admin_user=admin --admin_password=password --admin_email=wordpress@example.com --skip-email`;
|
150
|
+
return [header, wpCoreInstall].concat(configStringArray).join("\n");
|
151
|
+
};
|
152
|
+
|
153
|
+
// src/run.ts
|
154
|
+
import { createHash } from "crypto";
|
155
|
+
import os from "node:os";
|
156
|
+
var waitForServer = async (url, timeoutMs) => {
|
157
|
+
const startTime = Date.now();
|
158
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
159
|
+
while (startTime + timeoutMs > Date.now()) {
|
160
|
+
try {
|
161
|
+
const response = await fetch(url);
|
162
|
+
if (response.ok && (200 === response.status || 302 === response.status)) {
|
163
|
+
return true;
|
164
|
+
}
|
165
|
+
} catch (e) {
|
166
|
+
} finally {
|
167
|
+
await sleep(100);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
return false;
|
171
|
+
};
|
172
|
+
var start = async (port2, runPath2) => {
|
173
|
+
await upAll({
|
174
|
+
commandOptions: ["--build"],
|
175
|
+
composeOptions: ["-p", `port${port2}`],
|
176
|
+
cwd: runPath2,
|
177
|
+
log: true
|
178
|
+
});
|
179
|
+
await waitForServer(`http://localhost:${port2}`, 1e4);
|
180
|
+
await cli(port2, runPath2, "bash wp-config/configure-wp.sh");
|
181
|
+
};
|
182
|
+
var stop = async (port2, runPath2) => {
|
183
|
+
await downAll({
|
184
|
+
cwd: runPath2,
|
185
|
+
commandOptions: ["--volumes", "--remove-orphans"],
|
186
|
+
composeOptions: ["-p", `port${port2}`],
|
187
|
+
log: true
|
188
|
+
});
|
189
|
+
};
|
190
|
+
var cli = async (port2, runPath2, command2) => {
|
191
|
+
await run("cli", command2, {
|
192
|
+
cwd: runPath2,
|
193
|
+
commandOptions: ["--rm"],
|
194
|
+
composeOptions: ["-p", `port${port2}`],
|
195
|
+
log: true
|
196
|
+
});
|
197
|
+
};
|
198
|
+
var commandMap = {
|
199
|
+
start,
|
200
|
+
stop,
|
201
|
+
cli
|
202
|
+
};
|
203
|
+
var getWpConfigPath = (port2) => path2.resolve(process.cwd(), port2);
|
204
|
+
var generateFiles = (port2, configFilePath2) => {
|
205
|
+
const config = getConfig(configFilePath2);
|
206
|
+
const wpConfigPath = getWpConfigPath(port2);
|
207
|
+
if (!fs2.existsSync(wpConfigPath)) {
|
208
|
+
fs2.mkdirSync(wpConfigPath, { recursive: true });
|
209
|
+
}
|
210
|
+
const wpConfig = generateConfiguration(config, port2);
|
211
|
+
fs2.writeFileSync(path2.resolve(wpConfigPath, "configure-wp.sh"), wpConfig);
|
212
|
+
const dockerComposeYmlTemplate = generateDockerComposeYmlTemplate(config, process.cwd(), port2, wpConfigPath);
|
213
|
+
const wordPressDockerfileTemplate = generateWordPressDockerfileTemplate(config);
|
214
|
+
const cliDockerfileTemplate = generateCliDockerfileTemplate(config);
|
215
|
+
const hash = createHash("sha256");
|
216
|
+
hash.update(dockerComposeYmlTemplate + wordPressDockerfileTemplate + cliDockerfileTemplate + port2);
|
217
|
+
const runPath2 = path2.resolve(os.tmpdir(), `${hash.digest("hex")}`);
|
218
|
+
if (!fs2.existsSync(runPath2)) {
|
219
|
+
fs2.mkdirSync(runPath2);
|
220
|
+
}
|
221
|
+
console.log(`writing files to run path: ${runPath2}`);
|
222
|
+
fs2.writeFileSync(path2.resolve(runPath2, "docker-compose.yml"), dockerComposeYmlTemplate);
|
223
|
+
fs2.writeFileSync(path2.resolve(runPath2, "WordPress.Dockerfile"), wordPressDockerfileTemplate);
|
224
|
+
fs2.writeFileSync(path2.resolve(runPath2, "CLI.Dockerfile"), cliDockerfileTemplate);
|
225
|
+
return runPath2;
|
226
|
+
};
|
227
|
+
var getArgument = (argumentKey, processArgs) => {
|
228
|
+
for (let i = 3; i < processArgs.length; i++) {
|
229
|
+
const argument = processArgs[i];
|
230
|
+
if (argument.startsWith(`${argumentKey}=`)) {
|
231
|
+
return argument.substring(argumentKey.length + 1);
|
232
|
+
}
|
233
|
+
}
|
234
|
+
return void 0;
|
235
|
+
};
|
236
|
+
var getConfigFilePath = (processArgs) => {
|
237
|
+
return path2.resolve(getArgument("config", processArgs));
|
238
|
+
};
|
239
|
+
var getCliCommand = (processArgs) => {
|
240
|
+
return getArgument("command", processArgs);
|
241
|
+
};
|
242
|
+
var getPort = (processArgs) => {
|
243
|
+
return getArgument("port", processArgs) || "8888";
|
244
|
+
};
|
245
|
+
var cleanup = (port2, runPath2) => {
|
246
|
+
fs2.rmSync(getWpConfigPath(port2), { recursive: true, force: true });
|
247
|
+
fs2.rmSync(runPath2, { recursive: true, force: true });
|
248
|
+
};
|
249
|
+
|
250
|
+
// index.ts
|
251
|
+
var command = process.argv[2];
|
4
252
|
if (!commandMap[command]) {
|
5
|
-
|
253
|
+
console.log(`Valid commands: ${Object.keys(commandMap).join(", ")}. You used ${command}`);
|
6
254
|
}
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
255
|
+
var port = getPort(process.argv);
|
256
|
+
var configFilePath = getConfigFilePath(process.argv);
|
257
|
+
var runPath = generateFiles(port, configFilePath);
|
258
|
+
var cliCommand = getCliCommand(process.argv);
|
11
259
|
try {
|
12
|
-
|
13
|
-
}
|
14
|
-
|
15
|
-
cleanup(port, runPath);
|
260
|
+
await commandMap[command](port, runPath, cliCommand);
|
261
|
+
} finally {
|
262
|
+
cleanup(port, runPath);
|
16
263
|
}
|
264
|
+
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@elementor/wp-lite-env",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.11",
|
4
4
|
"private": false,
|
5
5
|
"description": "A simple, lightweight, docker-based WordPress environment",
|
6
6
|
"main": "dist/index.js",
|
@@ -10,7 +10,8 @@
|
|
10
10
|
"wp-lite-env": "dist/index.js"
|
11
11
|
},
|
12
12
|
"scripts": {
|
13
|
-
"build": "
|
13
|
+
"build": "tsup --config=./tsup.build.ts",
|
14
|
+
"dev": "tsup --config=./tsup.dev.ts",
|
14
15
|
"lint": "eslint",
|
15
16
|
"release": "npm run build && changeset publish",
|
16
17
|
"test": "jest --coverage=true"
|
@@ -40,6 +41,7 @@
|
|
40
41
|
"eslint": "~9.14.0",
|
41
42
|
"jest": "^29.7.0",
|
42
43
|
"ts-jest": "^29.2.5",
|
44
|
+
"tsup": "^8.3.5",
|
43
45
|
"typescript": "^5.6.3",
|
44
46
|
"typescript-eslint": "^8.14.0"
|
45
47
|
}
|
package/tsconfig.json
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
{
|
2
2
|
"$schema": "https://json.schemastore.org/tsconfig",
|
3
|
-
"display": "Node
|
3
|
+
"display": "Node 22 + ESM + Strictest",
|
4
4
|
"compilerOptions": {
|
5
5
|
"lib": [
|
6
|
-
"
|
6
|
+
"ESNext"
|
7
7
|
],
|
8
8
|
"outDir": "dist",
|
9
|
-
"module": "
|
9
|
+
"module": "ESNext",
|
10
10
|
"target": "ESNext",
|
11
11
|
"declaration": true,
|
12
12
|
"declarationMap": true,
|
13
13
|
"esModuleInterop": true,
|
14
14
|
"skipLibCheck": true,
|
15
15
|
"forceConsistentCasingInFileNames": true,
|
16
|
-
"moduleResolution": "
|
16
|
+
"moduleResolution": "bundler",
|
17
17
|
"allowUnusedLabels": false,
|
18
18
|
"allowUnreachableCode": false,
|
19
19
|
"noFallthroughCasesInSwitch": true,
|
@@ -26,7 +26,8 @@
|
|
26
26
|
"noUnusedParameters": true,
|
27
27
|
"checkJs": false,
|
28
28
|
"allowJs": false,
|
29
|
-
"resolveJsonModule": true
|
29
|
+
"resolveJsonModule": true,
|
30
|
+
"allowSyntheticDefaultImports": true
|
30
31
|
},
|
31
32
|
"include": ["./package.json", "index.*", "src/**/*"],
|
32
33
|
}
|
package/tsup.build.ts
ADDED
package/tsup.dev.ts
ADDED
package/dist/package.json
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"name": "@elementor/wp-lite-env",
|
3
|
-
"version": "0.0.9",
|
4
|
-
"private": false,
|
5
|
-
"description": "A simple, lightweight, docker-based WordPress environment",
|
6
|
-
"main": "dist/index.js",
|
7
|
-
"type": "module",
|
8
|
-
"types": "dist/index.d.ts",
|
9
|
-
"bin": {
|
10
|
-
"wp-lite-env": "dist/index.js"
|
11
|
-
},
|
12
|
-
"scripts": {
|
13
|
-
"build": "tsc",
|
14
|
-
"lint": "eslint",
|
15
|
-
"release": "npm run build && changeset publish",
|
16
|
-
"test": "jest --coverage=true"
|
17
|
-
},
|
18
|
-
"repository": {
|
19
|
-
"type": "git",
|
20
|
-
"url": "git+https://github.com/elementor/wp-lite-env.git"
|
21
|
-
},
|
22
|
-
"publishConfig": {
|
23
|
-
"access": "public"
|
24
|
-
},
|
25
|
-
"author": "Elementor Team",
|
26
|
-
"license": "ISC",
|
27
|
-
"bugs": {
|
28
|
-
"url": "https://github.com/elementor/wp-lite-env/issues"
|
29
|
-
},
|
30
|
-
"homepage": "https://github.com/elementor/wp-lite-env#readme",
|
31
|
-
"dependencies": {
|
32
|
-
"docker-compose": "^1.1.0"
|
33
|
-
},
|
34
|
-
"devDependencies": {
|
35
|
-
"@changesets/cli": "^2.27.9",
|
36
|
-
"@eslint/js": "^9.15.0",
|
37
|
-
"@jest/globals": "^29.7.0",
|
38
|
-
"@types/eslint__js": "^8.42.3",
|
39
|
-
"@types/node": "^22.9.0",
|
40
|
-
"eslint": "~9.14.0",
|
41
|
-
"jest": "^29.7.0",
|
42
|
-
"ts-jest": "^29.2.5",
|
43
|
-
"typescript": "^5.6.3",
|
44
|
-
"typescript-eslint": "^8.14.0"
|
45
|
-
}
|
46
|
-
}
|
package/dist/src/config.d.ts
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
export type Config = {
|
2
|
-
core?: string;
|
3
|
-
phpVersion?: string;
|
4
|
-
plugins?: {
|
5
|
-
[key: string]: string;
|
6
|
-
};
|
7
|
-
themes?: {
|
8
|
-
[key: string]: string;
|
9
|
-
};
|
10
|
-
mappings?: {
|
11
|
-
[key: string]: string;
|
12
|
-
};
|
13
|
-
config?: Record<string, string | boolean>;
|
14
|
-
};
|
15
|
-
export declare const getConfig: (configFilePath?: string) => Config;
|
16
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/src/config.js
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
import fs from 'fs';
|
2
|
-
export const getConfig = (configFilePath) => {
|
3
|
-
let configFile = {};
|
4
|
-
if (configFilePath) {
|
5
|
-
configFile = JSON.parse(fs.readFileSync(configFilePath, 'utf8'));
|
6
|
-
}
|
7
|
-
const defaultConfig = {
|
8
|
-
core: '6.7',
|
9
|
-
phpVersion: '8.1',
|
10
|
-
plugins: {},
|
11
|
-
themes: {},
|
12
|
-
mappings: {},
|
13
|
-
config: {},
|
14
|
-
};
|
15
|
-
return {
|
16
|
-
core: configFile.core || defaultConfig.core,
|
17
|
-
phpVersion: configFile.phpVersion || defaultConfig.phpVersion,
|
18
|
-
plugins: configFile.plugins || defaultConfig.plugins,
|
19
|
-
themes: configFile.themes || defaultConfig.themes,
|
20
|
-
mappings: configFile.mappings || defaultConfig.mappings,
|
21
|
-
config: configFile.config || defaultConfig.config,
|
22
|
-
};
|
23
|
-
};
|
package/dist/src/run.d.ts
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
export declare const start: (port: string, runPath: string) => Promise<void>;
|
2
|
-
export declare const stop: (port: string, runPath: string) => Promise<void>;
|
3
|
-
export declare const commandMap: {
|
4
|
-
[key: string]: ((port: string) => Promise<void>) | ((port: string, runPath: string, command: string) => Promise<void>);
|
5
|
-
};
|
6
|
-
export declare const generateFiles: (port: string, configFilePath: string) => string;
|
7
|
-
export declare const getConfigFilePath: (processArgs: string[]) => string;
|
8
|
-
export declare const getCliCommand: (processArgs: string[]) => string;
|
9
|
-
export declare const getPort: (processArgs: string[]) => string;
|
10
|
-
export declare const cleanup: (port: string, runPath: string) => void;
|
11
|
-
//# sourceMappingURL=run.d.ts.map
|
package/dist/src/run.js
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
import { downAll, run, upAll } from "docker-compose";
|
2
|
-
import path from "path";
|
3
|
-
import { getConfig } from "./config";
|
4
|
-
import fs from "fs";
|
5
|
-
import { generateCliDockerfileTemplate, generateConfiguration, generateDockerComposeYmlTemplate, generateWordPressDockerfileTemplate } from "./templates";
|
6
|
-
import { createHash } from "crypto";
|
7
|
-
import os from "node:os";
|
8
|
-
const waitForServer = async (url, timeoutMs) => {
|
9
|
-
const startTime = Date.now();
|
10
|
-
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
11
|
-
while (startTime + timeoutMs > Date.now()) {
|
12
|
-
try {
|
13
|
-
const response = await fetch(url);
|
14
|
-
if (response.ok && (200 === response.status || 302 === response.status)) {
|
15
|
-
return true;
|
16
|
-
}
|
17
|
-
}
|
18
|
-
catch (e) { // eslint-disable-line @typescript-eslint/no-unused-vars
|
19
|
-
// Ignore
|
20
|
-
}
|
21
|
-
finally {
|
22
|
-
await sleep(100);
|
23
|
-
}
|
24
|
-
}
|
25
|
-
return false;
|
26
|
-
};
|
27
|
-
export const start = async (port, runPath) => {
|
28
|
-
await upAll({
|
29
|
-
commandOptions: ['--build'],
|
30
|
-
composeOptions: ['-p', `port${port}`],
|
31
|
-
cwd: runPath,
|
32
|
-
log: true,
|
33
|
-
});
|
34
|
-
await waitForServer(`http://localhost:${port}`, 10000);
|
35
|
-
await cli(port, runPath, 'bash wp-config/configure-wp.sh');
|
36
|
-
};
|
37
|
-
export const stop = async (port, runPath) => {
|
38
|
-
await downAll({
|
39
|
-
cwd: runPath,
|
40
|
-
commandOptions: ['--volumes', '--remove-orphans'],
|
41
|
-
composeOptions: ['-p', `port${port}`],
|
42
|
-
log: true,
|
43
|
-
});
|
44
|
-
};
|
45
|
-
const cli = async (port, runPath, command) => {
|
46
|
-
await run('cli', command, {
|
47
|
-
cwd: runPath,
|
48
|
-
commandOptions: ['--rm'],
|
49
|
-
composeOptions: ['-p', `port${port}`],
|
50
|
-
log: true,
|
51
|
-
});
|
52
|
-
};
|
53
|
-
export const commandMap = {
|
54
|
-
start,
|
55
|
-
stop,
|
56
|
-
cli,
|
57
|
-
};
|
58
|
-
const getWpConfigPath = (port) => path.resolve(process.cwd(), port);
|
59
|
-
export const generateFiles = (port, configFilePath) => {
|
60
|
-
const config = getConfig(configFilePath);
|
61
|
-
// Using a local path since Docker Compose cannot access /tmp
|
62
|
-
// See: https://github.com/docker/compose/issues/1153
|
63
|
-
const wpConfigPath = getWpConfigPath(port);
|
64
|
-
if (!fs.existsSync(wpConfigPath)) {
|
65
|
-
fs.mkdirSync(wpConfigPath, { recursive: true });
|
66
|
-
}
|
67
|
-
const wpConfig = generateConfiguration(config, port);
|
68
|
-
fs.writeFileSync(path.resolve(wpConfigPath, 'configure-wp.sh'), wpConfig);
|
69
|
-
const dockerComposeYmlTemplate = generateDockerComposeYmlTemplate(config, process.cwd(), port, wpConfigPath);
|
70
|
-
const wordPressDockerfileTemplate = generateWordPressDockerfileTemplate(config);
|
71
|
-
const cliDockerfileTemplate = generateCliDockerfileTemplate(config);
|
72
|
-
const hash = createHash('sha256');
|
73
|
-
hash.update(dockerComposeYmlTemplate + wordPressDockerfileTemplate + cliDockerfileTemplate + port);
|
74
|
-
const runPath = path.resolve(os.tmpdir(), `${hash.digest('hex')}`);
|
75
|
-
if (!fs.existsSync(runPath)) {
|
76
|
-
fs.mkdirSync(runPath);
|
77
|
-
}
|
78
|
-
console.log(`writing files to run path: ${runPath}`);
|
79
|
-
fs.writeFileSync(path.resolve(runPath, 'docker-compose.yml'), dockerComposeYmlTemplate);
|
80
|
-
fs.writeFileSync(path.resolve(runPath, 'WordPress.Dockerfile'), wordPressDockerfileTemplate);
|
81
|
-
fs.writeFileSync(path.resolve(runPath, 'CLI.Dockerfile'), cliDockerfileTemplate);
|
82
|
-
return runPath;
|
83
|
-
};
|
84
|
-
const getArgument = (argumentKey, processArgs) => {
|
85
|
-
for (let i = 3; i < processArgs.length; i++) {
|
86
|
-
const argument = processArgs[i];
|
87
|
-
if (argument.startsWith(`${argumentKey}=`)) {
|
88
|
-
return argument.substring(argumentKey.length + 1);
|
89
|
-
}
|
90
|
-
}
|
91
|
-
return undefined;
|
92
|
-
};
|
93
|
-
export const getConfigFilePath = (processArgs) => {
|
94
|
-
return path.resolve(getArgument('config', processArgs));
|
95
|
-
};
|
96
|
-
export const getCliCommand = (processArgs) => {
|
97
|
-
return getArgument('command', processArgs);
|
98
|
-
};
|
99
|
-
export const getPort = (processArgs) => {
|
100
|
-
return getArgument('port', processArgs) || '8888';
|
101
|
-
};
|
102
|
-
export const cleanup = (port, runPath) => {
|
103
|
-
fs.rmSync(getWpConfigPath(port), { recursive: true, force: true });
|
104
|
-
fs.rmSync(runPath, { recursive: true, force: true });
|
105
|
-
};
|
package/dist/src/templates.d.ts
DELETED
@@ -1,6 +0,0 @@
|
|
1
|
-
import { Config } from './config';
|
2
|
-
export declare const generateDockerComposeYmlTemplate: (config: Config, basePath: string, port: string, configPath: string) => string;
|
3
|
-
export declare const generateWordPressDockerfileTemplate: (config: Config) => string;
|
4
|
-
export declare const generateCliDockerfileTemplate: (config: Config) => string;
|
5
|
-
export declare const generateConfiguration: (config: Config, port: string) => string;
|
6
|
-
//# sourceMappingURL=templates.d.ts.map
|
package/dist/src/templates.js
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
import path from 'path';
|
2
|
-
export const generateDockerComposeYmlTemplate = (config, basePath, port, configPath) => {
|
3
|
-
const mappingsStringArray = Object.keys(config.mappings).map((key) => {
|
4
|
-
const value = config.mappings[key];
|
5
|
-
return ` - >-
|
6
|
-
${path.resolve(basePath, value)}:/var/www/html/${key}\n`;
|
7
|
-
});
|
8
|
-
const pluginsStringArray = Object.keys(config.plugins).map((key) => {
|
9
|
-
const value = config.plugins[key];
|
10
|
-
return ` - >-
|
11
|
-
${path.resolve(basePath, value)}:/var/www/html/wp-content/plugins/${key}\n`;
|
12
|
-
});
|
13
|
-
const themesStringArray = Object.keys(config.themes).map((key) => {
|
14
|
-
const value = config.themes[key];
|
15
|
-
return ` - >-
|
16
|
-
${path.resolve(basePath, value)}:/var/www/html/wp-content/themes/${key}\n`;
|
17
|
-
});
|
18
|
-
const wpContent = ` - >-
|
19
|
-
wpcontent:/var/www/html\n`;
|
20
|
-
const wpConfig = ` - >-
|
21
|
-
${configPath}:/var/www/html/wp-config\n`;
|
22
|
-
const volumes = mappingsStringArray.concat(pluginsStringArray).concat(themesStringArray).concat([wpContent, wpConfig]).join('');
|
23
|
-
return `services:
|
24
|
-
mysql:
|
25
|
-
image: 'mariadb:lts'
|
26
|
-
ports:
|
27
|
-
- '\${WP_ENV_MYSQL_PORT:-}:3306'
|
28
|
-
environment:
|
29
|
-
MYSQL_ROOT_HOST: '%'
|
30
|
-
MYSQL_ROOT_PASSWORD: password
|
31
|
-
MYSQL_DATABASE: wordpress
|
32
|
-
volumes:
|
33
|
-
- 'mysql:/var/lib/mysql'
|
34
|
-
wordpress:
|
35
|
-
depends_on:
|
36
|
-
- mysql
|
37
|
-
build:
|
38
|
-
context: .
|
39
|
-
dockerfile: WordPress.Dockerfile
|
40
|
-
no_cache: true
|
41
|
-
args: &ref_0
|
42
|
-
HOST_USERNAME: yotams
|
43
|
-
HOST_UID: '502'
|
44
|
-
HOST_GID: '20'
|
45
|
-
ports:
|
46
|
-
- '\${WP_ENV_PORT:-${port}}:80'
|
47
|
-
environment:
|
48
|
-
APACHE_RUN_USER: '#502'
|
49
|
-
APACHE_RUN_GROUP: '#20'
|
50
|
-
WORDPRESS_DB_USER: root
|
51
|
-
WORDPRESS_DB_PASSWORD: password
|
52
|
-
WORDPRESS_DB_NAME: wordpress
|
53
|
-
volumes: &ref_1
|
54
|
-
${volumes}
|
55
|
-
extra_hosts:
|
56
|
-
- 'host.docker.internal:host-gateway'
|
57
|
-
cli:
|
58
|
-
depends_on:
|
59
|
-
- wordpress
|
60
|
-
build:
|
61
|
-
context: .
|
62
|
-
dockerfile: CLI.Dockerfile
|
63
|
-
args: *ref_0
|
64
|
-
volumes: *ref_1
|
65
|
-
user: '502:20'
|
66
|
-
environment:
|
67
|
-
WORDPRESS_DB_USER: root
|
68
|
-
WORDPRESS_DB_PASSWORD: password
|
69
|
-
WORDPRESS_DB_NAME: wordpress
|
70
|
-
extra_hosts:
|
71
|
-
- 'host.docker.internal:host-gateway'
|
72
|
-
volumes:
|
73
|
-
mysql: {}
|
74
|
-
wpcontent: {}
|
75
|
-
`;
|
76
|
-
};
|
77
|
-
export const generateWordPressDockerfileTemplate = (config) => {
|
78
|
-
return `FROM wordpress:${config.core}-php${config.phpVersion}
|
79
|
-
ARG HOST_USERNAME
|
80
|
-
ARG HOST_UID
|
81
|
-
ARG HOST_GID
|
82
|
-
# When the IDs are already in use we can still safely move on.
|
83
|
-
RUN groupadd -o -g $HOST_GID $HOST_USERNAME || true
|
84
|
-
RUN useradd -mlo -u $HOST_UID -g $HOST_GID $HOST_USERNAME || true
|
85
|
-
`;
|
86
|
-
};
|
87
|
-
export const generateCliDockerfileTemplate = (config) => {
|
88
|
-
return `FROM wordpress:cli-php${config.phpVersion}
|
89
|
-
ARG HOST_USERNAME
|
90
|
-
ARG HOST_UID
|
91
|
-
ARG HOST_GID
|
92
|
-
# When the IDs are already in use we can still safely move on.
|
93
|
-
RUN addgroup -g $HOST_GID $HOST_USERNAME || true
|
94
|
-
RUN useradd -mlo -u $HOST_UID -g $HOST_GID $HOST_USERNAME || true
|
95
|
-
# RUN adduser -h /home/$HOST_USERNAME -G $( getent group $HOST_GID | cut -d: -f1 ) -u $HOST_UID $HOST_USERNAME || true
|
96
|
-
|
97
|
-
# Have the container sleep infinitely to keep it alive for us to run commands on it.
|
98
|
-
CMD [ "/bin/sh", "-c", "while true; do sleep 2073600; done" ]
|
99
|
-
`;
|
100
|
-
};
|
101
|
-
export const generateConfiguration = (config, port) => {
|
102
|
-
const header = `#!/bin/bash
|
103
|
-
set -eox pipefail
|
104
|
-
`;
|
105
|
-
const configStringArray = Object.keys(config.config).map((key) => {
|
106
|
-
const value = config.config[key];
|
107
|
-
return `wp config set ${key} ${value} --raw`;
|
108
|
-
});
|
109
|
-
const wpCoreInstall = `wp core install --url="http://localhost:${port}" --title="test" --admin_user=admin --admin_password=password --admin_email=wordpress@example.com --skip-email`;
|
110
|
-
return [header, wpCoreInstall].concat(configStringArray).join('\n');
|
111
|
-
};
|