@wocker/ws 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +31 -0
- package/README.md +11 -137
- package/bin/ws.js +7 -3
- package/lib/App.d.ts +7 -5
- package/lib/App.js +45 -11
- package/lib/controllers/ImageController.d.ts +3 -1
- package/lib/controllers/ImageController.js +3 -1
- package/lib/controllers/PluginController.d.ts +14 -0
- package/lib/controllers/PluginController.js +62 -0
- package/lib/controllers/PresetController.d.ts +19 -0
- package/lib/controllers/PresetController.js +150 -0
- package/lib/controllers/ProjectController.d.ts +13 -5
- package/lib/controllers/ProjectController.js +92 -25
- package/lib/{plugins/ProxyPlugin.d.ts → controllers/ProxyController.d.ts} +9 -11
- package/lib/{plugins/ProxyPlugin.js → controllers/ProxyController.js} +120 -128
- package/lib/controllers/index.d.ts +3 -0
- package/lib/controllers/index.js +33 -0
- package/lib/env.js +9 -16
- package/lib/index.js +11 -24
- package/lib/makes/Docker.js +11 -25
- package/lib/makes/FS.d.ts +1 -1
- package/lib/makes/FS.js +13 -10
- package/lib/makes/Logger.d.ts +1 -7
- package/lib/makes/Logger.js +6 -33
- package/lib/makes/Plugin.js +2 -2
- package/lib/plugins/ElasticSearchPlugin.d.ts +16 -0
- package/lib/plugins/ElasticSearchPlugin.js +72 -0
- package/lib/plugins/LocaltunnelPlugin.d.ts +3 -3
- package/lib/plugins/LocaltunnelPlugin.js +17 -15
- package/lib/plugins/MaildevPlugin.d.ts +3 -1
- package/lib/plugins/MaildevPlugin.js +8 -5
- package/lib/plugins/MongodbPlugin.d.ts +5 -3
- package/lib/plugins/MongodbPlugin.js +10 -16
- package/lib/plugins/NgrokPlugin.d.ts +2 -3
- package/lib/plugins/NgrokPlugin.js +7 -6
- package/lib/plugins/PageKitePlugin.d.ts +2 -3
- package/lib/plugins/PageKitePlugin.js +8 -6
- package/lib/plugins/PostgresPlugin.js +5 -4
- package/lib/plugins/ProxmoxPlugin.js +2 -2
- package/lib/plugins/RedisPlugin.d.ts +8 -2
- package/lib/plugins/RedisPlugin.js +57 -20
- package/lib/plugins/index.d.ts +2 -6
- package/lib/plugins/index.js +11 -66
- package/lib/services/AppConfigService.d.ts +14 -4
- package/lib/services/AppConfigService.js +88 -3
- package/lib/services/AppEventsService.d.ts +5 -8
- package/lib/services/AppEventsService.js +2 -3
- package/lib/services/DockerService.d.ts +16 -0
- package/lib/services/DockerService.js +220 -0
- package/lib/services/LogService.d.ts +11 -0
- package/lib/services/LogService.js +39 -0
- package/lib/services/PluginService.d.ts +10 -0
- package/lib/services/PluginService.js +18 -0
- package/lib/services/PresetService.d.ts +9 -0
- package/lib/services/PresetService.js +63 -0
- package/lib/services/ProjectService.d.ts +8 -7
- package/lib/services/ProjectService.js +64 -12
- package/lib/services/index.d.ts +4 -0
- package/lib/services/index.js +44 -0
- package/lib/utils/demuxOutput.js +0 -2
- package/lib/utils/exec.d.ts +1 -1
- package/lib/utils/exec.js +4 -5
- package/lib/utils/fetch.js +3 -4
- package/lib/utils/image-build.js +2 -2
- package/lib/utils/index.d.ts +0 -4
- package/lib/utils/index.js +0 -44
- package/lib/utils/injectVariables.js +1 -1
- package/package.json +13 -13
- package/presets/node/config.json +9 -7
- package/presets/php-apache/Dockerfile +37 -36
- package/presets/php-apache/config.json +10 -15
- package/presets/php-fpm/Dockerfile +21 -0
- package/presets/php-fpm/config.json +25 -0
- package/lib/models/Preset.d.ts +0 -19
- package/lib/models/Preset.js +0 -60
- package/lib/models/Project.d.ts +0 -38
- package/lib/models/Project.js +0 -151
- package/lib/models/index.d.ts +0 -2
- package/lib/models/index.js +0 -27
- package/lib/plugins/MariadbPlugin.d.ts +0 -25
- package/lib/plugins/MariadbPlugin.js +0 -297
- package/lib/plugins/PresetPlugin.d.ts +0 -19
- package/lib/plugins/PresetPlugin.js +0 -164
- package/lib/plugins/ProjectPlugin.d.ts +0 -12
- package/lib/plugins/ProjectPlugin.js +0 -54
- package/lib/plugins/ServeoPlugin.d.ts +0 -36
- package/lib/plugins/ServeoPlugin.js +0 -260
- package/lib/plugins/TestPlugin.d.ts +0 -10
- package/lib/plugins/TestPlugin.js +0 -75
- package/lib/utils/promptConfirm.d.ts +0 -6
- package/lib/utils/promptConfirm.js +0 -21
- package/lib/utils/promptGroup.d.ts +0 -16
- package/lib/utils/promptGroup.js +0 -39
- package/lib/utils/promptSelect.d.ts +0 -12
- package/lib/utils/promptSelect.js +0 -47
- package/lib/utils/promptText.d.ts +0 -13
- package/lib/utils/promptText.js +0 -53
- package/plugins/serveo/Dockerfile +0 -17
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { DI, DockerService as CoreDockerService, DockerServiceParams as Params } from "@wocker/core";
|
|
3
|
+
import Docker, { Container } from "dockerode";
|
|
4
|
+
declare class DockerService extends CoreDockerService {
|
|
5
|
+
protected docker: Docker;
|
|
6
|
+
constructor(di: DI);
|
|
7
|
+
createContainer(params: Params.CreateContainer): Promise<Container>;
|
|
8
|
+
getContainer(name: string): Promise<Container | null>;
|
|
9
|
+
removeContainer(name: string): Promise<void>;
|
|
10
|
+
buildImage(params: Params.BuildImage): Promise<void>;
|
|
11
|
+
imageExists(tag: string): Promise<boolean>;
|
|
12
|
+
imageRm(tag: string): Promise<void>;
|
|
13
|
+
pullImage(tag: string): Promise<void>;
|
|
14
|
+
attachStream(stream: NodeJS.ReadWriteStream): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export { DockerService };
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DockerService = void 0;
|
|
7
|
+
var _core = require("@wocker/core");
|
|
8
|
+
var _dockerode = _interopRequireDefault(require("dockerode"));
|
|
9
|
+
var _makes = require("../makes");
|
|
10
|
+
var _utils = require("../utils");
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
class DockerService extends _core.DockerService {
|
|
13
|
+
constructor(di) {
|
|
14
|
+
super();
|
|
15
|
+
this.docker = new _dockerode.default({
|
|
16
|
+
socketPath: "/var/run/docker.sock"
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async createContainer(params) {
|
|
20
|
+
const {
|
|
21
|
+
name,
|
|
22
|
+
tty,
|
|
23
|
+
image,
|
|
24
|
+
projectId,
|
|
25
|
+
restart,
|
|
26
|
+
ulimits,
|
|
27
|
+
extraHosts,
|
|
28
|
+
networkMode,
|
|
29
|
+
links = [],
|
|
30
|
+
env = {},
|
|
31
|
+
volumes = [],
|
|
32
|
+
ports = [],
|
|
33
|
+
cmd = []
|
|
34
|
+
} = params;
|
|
35
|
+
const network = this.docker.getNetwork("workspace");
|
|
36
|
+
try {
|
|
37
|
+
await network.inspect();
|
|
38
|
+
} catch (err) {
|
|
39
|
+
if (err.statusCode === 404) {
|
|
40
|
+
await this.docker.createNetwork({
|
|
41
|
+
Name: "workspace"
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
await this.pullImage(image);
|
|
46
|
+
return this.docker.createContainer({
|
|
47
|
+
name,
|
|
48
|
+
Image: image,
|
|
49
|
+
Hostname: name,
|
|
50
|
+
Labels: {
|
|
51
|
+
...(projectId ? {
|
|
52
|
+
projectId
|
|
53
|
+
} : {})
|
|
54
|
+
},
|
|
55
|
+
AttachStdin: true,
|
|
56
|
+
AttachStdout: true,
|
|
57
|
+
AttachStderr: true,
|
|
58
|
+
OpenStdin: true,
|
|
59
|
+
StdinOnce: false,
|
|
60
|
+
Tty: tty,
|
|
61
|
+
Cmd: cmd,
|
|
62
|
+
Env: Object.keys(env).map(key => {
|
|
63
|
+
const value = env[key];
|
|
64
|
+
return `${key}=${value}`;
|
|
65
|
+
}),
|
|
66
|
+
ExposedPorts: ports.reduce((res, value) => {
|
|
67
|
+
const [,, containerPort] = /(\d+):(\d+)/.exec(value) || [];
|
|
68
|
+
if (containerPort) {
|
|
69
|
+
res[`${containerPort}/tcp`] = {};
|
|
70
|
+
}
|
|
71
|
+
return res;
|
|
72
|
+
}, {}),
|
|
73
|
+
HostConfig: {
|
|
74
|
+
NetworkMode: networkMode,
|
|
75
|
+
ExtraHosts: extraHosts,
|
|
76
|
+
Ulimits: ulimits ? Object.keys(ulimits).reduce((res, name) => {
|
|
77
|
+
return [...res, {
|
|
78
|
+
Name: name,
|
|
79
|
+
Hard: ulimits[name].hard,
|
|
80
|
+
Soft: ulimits[name].soft
|
|
81
|
+
}];
|
|
82
|
+
}, []) : [],
|
|
83
|
+
...(restart ? {
|
|
84
|
+
RestartPolicy: {
|
|
85
|
+
Name: restart
|
|
86
|
+
}
|
|
87
|
+
} : {}),
|
|
88
|
+
Binds: volumes,
|
|
89
|
+
PortBindings: ports.reduce((res, value) => {
|
|
90
|
+
const [, hostPort, containerPort] = /(\d+):(\d+)/.exec(value) || [];
|
|
91
|
+
if (hostPort && containerPort) {
|
|
92
|
+
res[`${containerPort}/tcp`] = [{
|
|
93
|
+
HostPort: hostPort
|
|
94
|
+
}];
|
|
95
|
+
}
|
|
96
|
+
return res;
|
|
97
|
+
}, {})
|
|
98
|
+
},
|
|
99
|
+
NetworkingConfig: {
|
|
100
|
+
EndpointsConfig: networkMode === "host" ? {} : {
|
|
101
|
+
workspace: {
|
|
102
|
+
Links: links
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async getContainer(name) {
|
|
109
|
+
const containers = await this.docker.listContainers({
|
|
110
|
+
all: true,
|
|
111
|
+
filters: {
|
|
112
|
+
name: [name]
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const container = containers.find(container => {
|
|
116
|
+
return container.Names.indexOf("/" + name) >= 0;
|
|
117
|
+
});
|
|
118
|
+
if (container) {
|
|
119
|
+
return this.docker.getContainer(container.Id);
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
async removeContainer(name) {
|
|
124
|
+
const container = await this.getContainer(name);
|
|
125
|
+
if (!container) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const {
|
|
129
|
+
State: {
|
|
130
|
+
Status
|
|
131
|
+
}
|
|
132
|
+
} = await container.inspect();
|
|
133
|
+
if (Status === "running" || Status === "restarting") {
|
|
134
|
+
try {
|
|
135
|
+
await container.stop();
|
|
136
|
+
} catch (err) {
|
|
137
|
+
_core.Logger.error("DockerService.removeContainer", err.message);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
await container.remove();
|
|
142
|
+
} catch (err) {
|
|
143
|
+
_core.Logger.error("DockerService.removeContainer: ", err.message);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async buildImage(params) {
|
|
147
|
+
const {
|
|
148
|
+
tag,
|
|
149
|
+
labels = {},
|
|
150
|
+
buildArgs = {},
|
|
151
|
+
context,
|
|
152
|
+
src
|
|
153
|
+
} = params;
|
|
154
|
+
const files = await _makes.FS.readdirFiles(context, {
|
|
155
|
+
recursive: true
|
|
156
|
+
});
|
|
157
|
+
const stream = await this.docker.buildImage({
|
|
158
|
+
context,
|
|
159
|
+
src: files
|
|
160
|
+
}, {
|
|
161
|
+
t: tag,
|
|
162
|
+
labels,
|
|
163
|
+
buildargs: Object.keys(buildArgs).reduce((res, key) => {
|
|
164
|
+
res[key] = typeof buildArgs[key] !== "string" ? buildArgs[key].toString() : buildArgs[key];
|
|
165
|
+
return res;
|
|
166
|
+
}, {}),
|
|
167
|
+
dockerfile: src
|
|
168
|
+
});
|
|
169
|
+
await (0, _utils.followProgress)(stream);
|
|
170
|
+
}
|
|
171
|
+
async imageExists(tag) {
|
|
172
|
+
const image = this.docker.getImage(tag);
|
|
173
|
+
try {
|
|
174
|
+
await image.inspect();
|
|
175
|
+
return true;
|
|
176
|
+
} catch (ignore) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async imageRm(tag) {
|
|
181
|
+
const image = await this.docker.getImage(tag);
|
|
182
|
+
if (!image) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
await image.remove();
|
|
186
|
+
}
|
|
187
|
+
async pullImage(tag) {
|
|
188
|
+
const exists = await this.imageExists(tag);
|
|
189
|
+
if (exists) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const stream = await this.docker.pull(tag);
|
|
193
|
+
await (0, _utils.followProgress)(stream);
|
|
194
|
+
}
|
|
195
|
+
async attachStream(stream) {
|
|
196
|
+
process.stdin.resume();
|
|
197
|
+
process.stdin.setEncoding("utf8");
|
|
198
|
+
process.stdin.pipe(stream);
|
|
199
|
+
if (process.stdin.isTTY) {
|
|
200
|
+
process.stdin.setRawMode(true);
|
|
201
|
+
}
|
|
202
|
+
stream.setEncoding("utf8");
|
|
203
|
+
stream.pipe(process.stdout);
|
|
204
|
+
const end = () => {
|
|
205
|
+
process.stdin.pause();
|
|
206
|
+
process.stdin.unpipe(stream);
|
|
207
|
+
if (process.stdin.isTTY) {
|
|
208
|
+
process.stdin.setRawMode(false);
|
|
209
|
+
}
|
|
210
|
+
stream.unpipe(process.stdout);
|
|
211
|
+
};
|
|
212
|
+
await new Promise((resolve, reject) => {
|
|
213
|
+
stream.on("end", end);
|
|
214
|
+
stream.on("error", end);
|
|
215
|
+
stream.on("end", resolve);
|
|
216
|
+
stream.on("error", reject);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
exports.DockerService = DockerService;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DI, AppConfigService } from "@wocker/core";
|
|
2
|
+
declare class LogService {
|
|
3
|
+
protected appConfigService: AppConfigService;
|
|
4
|
+
constructor(di: DI);
|
|
5
|
+
log(...data: any[]): void;
|
|
6
|
+
info(...data: any[]): void;
|
|
7
|
+
warning(...data: any[]): void;
|
|
8
|
+
error(...data: any[]): void;
|
|
9
|
+
protected _log(type: string, ...data: any[]): void;
|
|
10
|
+
}
|
|
11
|
+
export { LogService };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.LogService = void 0;
|
|
7
|
+
var _core = require("@wocker/core");
|
|
8
|
+
var _format = _interopRequireDefault(require("date-fns/format"));
|
|
9
|
+
var _makes = require("../makes");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
class LogService {
|
|
12
|
+
constructor(di) {
|
|
13
|
+
this.appConfigService = di.resolveService(_core.AppConfigService);
|
|
14
|
+
}
|
|
15
|
+
log(...data) {
|
|
16
|
+
this._log("log", ...data);
|
|
17
|
+
}
|
|
18
|
+
info(...data) {
|
|
19
|
+
this._log("info", ...data);
|
|
20
|
+
}
|
|
21
|
+
warning(...data) {
|
|
22
|
+
this._log("warning", ...data);
|
|
23
|
+
}
|
|
24
|
+
error(...data) {
|
|
25
|
+
this._log("error", ...data);
|
|
26
|
+
}
|
|
27
|
+
_log(type, ...data) {
|
|
28
|
+
const time = (0, _format.default)(new Date(), "yyyy-MM-dd hh:mm:ss");
|
|
29
|
+
const logPath = this.appConfigService.dataPath("ws.log");
|
|
30
|
+
const logData = data.map(item => {
|
|
31
|
+
return typeof item !== "string" ? JSON.stringify(item) : item;
|
|
32
|
+
}).join(" ");
|
|
33
|
+
if (!_makes.FS.existsSync(logPath)) {
|
|
34
|
+
_makes.FS.writeFileSync(logPath, "");
|
|
35
|
+
}
|
|
36
|
+
_makes.FS.appendFileSync(logPath, `[${time}] ${type}: ${logData}\n`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.LogService = LogService;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PluginService = void 0;
|
|
7
|
+
var _core = require("@wocker/core");
|
|
8
|
+
class PluginService {
|
|
9
|
+
constructor(di) {
|
|
10
|
+
this.di = di;
|
|
11
|
+
this.cli = di.resolveService(_core.Cli);
|
|
12
|
+
}
|
|
13
|
+
use(Constructor) {
|
|
14
|
+
const controller = new Constructor(this.di);
|
|
15
|
+
controller.install(this.cli);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.PluginService = PluginService;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DI, PresetService as CorePresetService, PresetServiceSearchOptions as SearchOptions, Preset, EnvConfig } from "@wocker/core";
|
|
2
|
+
declare class PresetService extends CorePresetService {
|
|
3
|
+
constructor(di: DI);
|
|
4
|
+
getImageName(preset: Preset, buildArgs?: EnvConfig): string;
|
|
5
|
+
save(preset: Preset): Promise<void>;
|
|
6
|
+
get(name: string): Promise<Preset>;
|
|
7
|
+
search(options?: SearchOptions): Promise<Preset[]>;
|
|
8
|
+
}
|
|
9
|
+
export { PresetService };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PresetService = void 0;
|
|
7
|
+
var _core = require("@wocker/core");
|
|
8
|
+
var _md = _interopRequireDefault(require("md5"));
|
|
9
|
+
var _makes = require("../makes");
|
|
10
|
+
var _env = require("../env");
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
class PresetService extends _core.PresetService {
|
|
13
|
+
constructor(di) {
|
|
14
|
+
super();
|
|
15
|
+
}
|
|
16
|
+
getImageName(preset, buildArgs = {}) {
|
|
17
|
+
const rawValues = [];
|
|
18
|
+
const hashValues = [];
|
|
19
|
+
Object.keys(preset.buildArgsOptions || {}).forEach(key => {
|
|
20
|
+
const hash = (preset.buildArgsOptions[key] || {}).hash || true;
|
|
21
|
+
const value = buildArgs[key];
|
|
22
|
+
if (hash) {
|
|
23
|
+
hashValues.push(value);
|
|
24
|
+
} else {
|
|
25
|
+
rawValues.push(value);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
const version = [...rawValues, (0, _md.default)(hashValues.join(",")).substr(0, 6)].filter(value => {
|
|
29
|
+
return !!value;
|
|
30
|
+
}).join("-");
|
|
31
|
+
return `ws-preset-${preset.name}:${version}`;
|
|
32
|
+
}
|
|
33
|
+
async save(preset) {
|
|
34
|
+
//
|
|
35
|
+
}
|
|
36
|
+
async get(name) {
|
|
37
|
+
const config = await _makes.FS.readJSON(_env.PRESETS_DIR, name, "config.json");
|
|
38
|
+
return new _core.Preset({
|
|
39
|
+
name,
|
|
40
|
+
...config
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async search(options = {}) {
|
|
44
|
+
const {
|
|
45
|
+
name
|
|
46
|
+
} = options;
|
|
47
|
+
const presets = [];
|
|
48
|
+
const dirs = await _makes.FS.readdir(_env.PRESETS_DIR);
|
|
49
|
+
for (const dir of dirs) {
|
|
50
|
+
if (name && name !== dir) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const config = await _makes.FS.readJSON(_env.PRESETS_DIR, dir, "config.json");
|
|
54
|
+
const preset = new _core.Preset({
|
|
55
|
+
name: dir,
|
|
56
|
+
...config
|
|
57
|
+
});
|
|
58
|
+
presets.push(preset);
|
|
59
|
+
}
|
|
60
|
+
return presets;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.PresetService = PresetService;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { Project } from "
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
protected
|
|
6
|
-
|
|
7
|
-
constructor(appConfigService: AppConfigService, appEventsService: AppEventsService);
|
|
1
|
+
import { DI, AppConfigService as CoreAppConfigService, AppEventsService as CoreAppEventsService, DockerService, ProjectService as CoreProjectService, ProjectServiceSearchParams as SearchParams, Project } from "@wocker/core";
|
|
2
|
+
declare class ProjectService extends CoreProjectService {
|
|
3
|
+
protected appConfigService: CoreAppConfigService;
|
|
4
|
+
protected appEventsService: CoreAppEventsService;
|
|
5
|
+
protected dockerService: DockerService;
|
|
6
|
+
constructor(di: DI);
|
|
8
7
|
cdProject(name: string): Promise<void>;
|
|
9
8
|
get(): Promise<Project>;
|
|
10
9
|
start(): Promise<void>;
|
|
11
10
|
stop(): Promise<void>;
|
|
11
|
+
save(project: Project): Promise<void>;
|
|
12
|
+
search(params?: Partial<SearchParams>): Promise<Project[]>;
|
|
12
13
|
}
|
|
13
14
|
export { ProjectService };
|
|
@@ -4,18 +4,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ProjectService = void 0;
|
|
7
|
+
var _core = require("@wocker/core");
|
|
7
8
|
var Path = _interopRequireWildcard(require("path"));
|
|
8
9
|
var _makes = require("../makes");
|
|
9
|
-
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
this.appConfigService =
|
|
15
|
-
this.appEventsService =
|
|
10
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
11
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
12
|
+
class ProjectService extends _core.ProjectService {
|
|
13
|
+
constructor(di) {
|
|
14
|
+
super();
|
|
15
|
+
this.appConfigService = di.resolveService(_core.AppConfigService);
|
|
16
|
+
this.appEventsService = di.resolveService(_core.AppEventsService);
|
|
17
|
+
this.dockerService = di.resolveService(_core.DockerService);
|
|
16
18
|
}
|
|
17
19
|
async cdProject(name) {
|
|
18
|
-
const project = await
|
|
20
|
+
const project = await _core.Project.searchOne({
|
|
19
21
|
name
|
|
20
22
|
});
|
|
21
23
|
if (!project) {
|
|
@@ -24,8 +26,8 @@ class ProjectService {
|
|
|
24
26
|
this.appConfigService.setPWD(project.path);
|
|
25
27
|
}
|
|
26
28
|
async get() {
|
|
27
|
-
const project = await
|
|
28
|
-
|
|
29
|
+
const project = await _core.Project.searchOne({
|
|
30
|
+
path: this.appConfigService.getPWD()
|
|
29
31
|
});
|
|
30
32
|
if (!project) {
|
|
31
33
|
throw new Error("Project not found");
|
|
@@ -49,7 +51,7 @@ class ProjectService {
|
|
|
49
51
|
}
|
|
50
52
|
await this.appEventsService.emit("project:beforeStart", project);
|
|
51
53
|
const containerName = `${project.name}.workspace`;
|
|
52
|
-
let container = await
|
|
54
|
+
let container = await this.dockerService.getContainer(containerName);
|
|
53
55
|
if (!container) {
|
|
54
56
|
container = await _makes.Docker.createContainer({
|
|
55
57
|
name: containerName,
|
|
@@ -62,7 +64,8 @@ class ProjectService {
|
|
|
62
64
|
const regVolume = /^([^:]+):([^:]+)(?::([^:]+))?$/;
|
|
63
65
|
const [, source, destination, options] = regVolume.exec(volume);
|
|
64
66
|
return `${Path.join(this.appConfigService.getPWD(), source)}:${destination}` + (options ? `:${options}` : "");
|
|
65
|
-
})
|
|
67
|
+
}),
|
|
68
|
+
ports: project.ports || []
|
|
66
69
|
});
|
|
67
70
|
} else {
|
|
68
71
|
process.stdout.write("Container already exists\n");
|
|
@@ -87,5 +90,54 @@ class ProjectService {
|
|
|
87
90
|
await _makes.Docker.removeContainer(`${project.name}.workspace`);
|
|
88
91
|
}
|
|
89
92
|
}
|
|
93
|
+
async save(project) {
|
|
94
|
+
if (!project.name) {
|
|
95
|
+
throw new Error("Project should has a name");
|
|
96
|
+
}
|
|
97
|
+
if (!project.path) {
|
|
98
|
+
throw new Error("Project should has a path");
|
|
99
|
+
}
|
|
100
|
+
if (!project.id) {
|
|
101
|
+
project.id = project.name;
|
|
102
|
+
}
|
|
103
|
+
const projectDirPath = this.appConfigService.dataPath("projects", project.id);
|
|
104
|
+
const configPath = this.appConfigService.dataPath("projects", project.id, "config.json");
|
|
105
|
+
if (!_makes.FS.existsSync(projectDirPath)) {
|
|
106
|
+
await _makes.FS.mkdir(projectDirPath, {
|
|
107
|
+
recursive: true
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
await this.appConfigService.setProjectConfig(project.id, project.path);
|
|
111
|
+
await _makes.FS.writeJSON(configPath, project);
|
|
112
|
+
}
|
|
113
|
+
async search(params = {}) {
|
|
114
|
+
const {
|
|
115
|
+
id,
|
|
116
|
+
name,
|
|
117
|
+
path
|
|
118
|
+
} = params;
|
|
119
|
+
const {
|
|
120
|
+
projects: configs
|
|
121
|
+
} = await this.appConfigService.getAppConfig();
|
|
122
|
+
const projects = [];
|
|
123
|
+
for (const config of configs) {
|
|
124
|
+
if (id && config.id !== id) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (path && config.src !== path) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const projectData = await _makes.FS.readJSON(this.appConfigService.dataPath("projects", config.id, "config.json"));
|
|
131
|
+
if (name && projectData.name !== name) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const project = _core.Project.fromObject({
|
|
135
|
+
id: config.id,
|
|
136
|
+
...projectData
|
|
137
|
+
});
|
|
138
|
+
projects.push(project);
|
|
139
|
+
}
|
|
140
|
+
return projects;
|
|
141
|
+
}
|
|
90
142
|
}
|
|
91
143
|
exports.ProjectService = ProjectService;
|
package/lib/services/index.d.ts
CHANGED
package/lib/services/index.js
CHANGED
|
@@ -25,6 +25,50 @@ Object.keys(_AppEventsService).forEach(function (key) {
|
|
|
25
25
|
}
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
|
+
var _DockerService = require("./DockerService");
|
|
29
|
+
Object.keys(_DockerService).forEach(function (key) {
|
|
30
|
+
if (key === "default" || key === "__esModule") return;
|
|
31
|
+
if (key in exports && exports[key] === _DockerService[key]) return;
|
|
32
|
+
Object.defineProperty(exports, key, {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () {
|
|
35
|
+
return _DockerService[key];
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
var _LogService = require("./LogService");
|
|
40
|
+
Object.keys(_LogService).forEach(function (key) {
|
|
41
|
+
if (key === "default" || key === "__esModule") return;
|
|
42
|
+
if (key in exports && exports[key] === _LogService[key]) return;
|
|
43
|
+
Object.defineProperty(exports, key, {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _LogService[key];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
var _PluginService = require("./PluginService");
|
|
51
|
+
Object.keys(_PluginService).forEach(function (key) {
|
|
52
|
+
if (key === "default" || key === "__esModule") return;
|
|
53
|
+
if (key in exports && exports[key] === _PluginService[key]) return;
|
|
54
|
+
Object.defineProperty(exports, key, {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function () {
|
|
57
|
+
return _PluginService[key];
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
var _PresetService = require("./PresetService");
|
|
62
|
+
Object.keys(_PresetService).forEach(function (key) {
|
|
63
|
+
if (key === "default" || key === "__esModule") return;
|
|
64
|
+
if (key in exports && exports[key] === _PresetService[key]) return;
|
|
65
|
+
Object.defineProperty(exports, key, {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
get: function () {
|
|
68
|
+
return _PresetService[key];
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
28
72
|
var _ProjectService = require("./ProjectService");
|
|
29
73
|
Object.keys(_ProjectService).forEach(function (key) {
|
|
30
74
|
if (key === "default" || key === "__esModule") return;
|
package/lib/utils/demuxOutput.js
CHANGED
|
@@ -8,8 +8,6 @@ const demuxOutput = buffer => {
|
|
|
8
8
|
let nextDataLength = null,
|
|
9
9
|
output = Buffer.from([]);
|
|
10
10
|
while (buffer.length > 0) {
|
|
11
|
-
// Logger.info(buffer.length, buffer.toString("utf8"));
|
|
12
|
-
|
|
13
11
|
const header = bufferSlice(8);
|
|
14
12
|
nextDataLength = header.readUInt32BE(4);
|
|
15
13
|
const content = bufferSlice(nextDataLength);
|
package/lib/utils/exec.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const exec: (command:
|
|
1
|
+
declare const exec: (command: string) => Promise<unknown>;
|
|
2
2
|
export { exec };
|
package/lib/utils/exec.js
CHANGED
|
@@ -4,12 +4,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.exec = void 0;
|
|
7
|
+
var _core = require("@wocker/core");
|
|
7
8
|
var _child_process = require("child_process");
|
|
8
9
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
9
|
-
var _Logger = require("../makes/Logger");
|
|
10
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
11
|
const exec = async command => {
|
|
12
|
-
|
|
12
|
+
_core.Logger.info(` > ${command.trim().replace(/\s+/g, " ")}`);
|
|
13
13
|
return new Promise((resolve, reject) => {
|
|
14
14
|
const worker = (0, _child_process.exec)(command, {
|
|
15
15
|
maxBuffer: Infinity
|
|
@@ -29,15 +29,14 @@ const exec = async command => {
|
|
|
29
29
|
}
|
|
30
30
|
if (worker.stderr) {
|
|
31
31
|
worker.stderr.on("data", data => {
|
|
32
|
-
// process.stdout.write(chalk.red(data));
|
|
33
32
|
process.stderr.write(data);
|
|
34
33
|
});
|
|
35
34
|
}
|
|
36
35
|
worker.on("close", code => {
|
|
37
|
-
|
|
36
|
+
_core.Logger.info("close", _chalk.default.red(code));
|
|
38
37
|
});
|
|
39
38
|
worker.on("exit", code => {
|
|
40
|
-
|
|
39
|
+
_core.Logger.info("exit", _chalk.default.red(code));
|
|
41
40
|
});
|
|
42
41
|
});
|
|
43
42
|
};
|
package/lib/utils/fetch.js
CHANGED
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.fetch = void 0;
|
|
7
7
|
var https = _interopRequireWildcard(require("https"));
|
|
8
|
-
function _getRequireWildcardCache(
|
|
9
|
-
function _interopRequireWildcard(
|
|
8
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
9
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
10
10
|
const fetch = async (url, options) => {
|
|
11
11
|
const {
|
|
12
12
|
method = "GET"
|
|
@@ -33,5 +33,4 @@ const fetch = async (url, options) => {
|
|
|
33
33
|
req.end();
|
|
34
34
|
});
|
|
35
35
|
};
|
|
36
|
-
exports.fetch = fetch;
|
|
37
|
-
class Response {}
|
|
36
|
+
exports.fetch = fetch;
|