@wocker/ws 1.0.15 → 1.0.17
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/lib/AppModule.js +7 -4
- package/lib/controllers/DebugController.d.ts +3 -0
- package/lib/controllers/DebugController.js +43 -1
- package/lib/controllers/PluginController.d.ts +5 -4
- package/lib/controllers/PluginController.js +28 -20
- package/lib/controllers/PresetController.d.ts +2 -0
- package/lib/controllers/PresetController.js +45 -11
- package/lib/controllers/ProjectController.d.ts +5 -1
- package/lib/controllers/ProjectController.js +138 -34
- package/lib/env.d.ts +0 -1
- package/lib/env.js +1 -2
- package/lib/main.js +2 -2
- package/lib/services/AppConfigService.d.ts +6 -7
- package/lib/services/AppConfigService.js +53 -27
- package/lib/services/DockerService.js +17 -10
- package/lib/services/LogService.d.ts +3 -1
- package/lib/services/LogService.js +9 -1
- package/lib/services/NpmService.d.ts +5 -0
- package/lib/services/NpmService.js +33 -0
- package/lib/services/PluginService.js +1 -1
- package/lib/services/PresetService.d.ts +11 -4
- package/lib/services/PresetService.js +155 -23
- package/lib/services/ProjectService.d.ts +0 -1
- package/lib/services/ProjectService.js +26 -41
- package/lib/services/ProxyService.js +6 -6
- package/lib/services/index.d.ts +1 -0
- package/lib/services/index.js +1 -0
- package/lib/types/PackageInfo.d.ts +20 -0
- package/lib/types/PackageInfo.js +2 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +17 -0
- package/package.json +3 -3
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.NpmService = void 0;
|
|
10
|
+
const core_1 = require("@wocker/core");
|
|
11
|
+
const makes_1 = require("../makes");
|
|
12
|
+
const utils_1 = require("../utils");
|
|
13
|
+
let NpmService = class NpmService {
|
|
14
|
+
async getPackageInfo(name) {
|
|
15
|
+
const res = await makes_1.Http.get("https://registry.npmjs.org")
|
|
16
|
+
.send(name);
|
|
17
|
+
if (res.status === 404) {
|
|
18
|
+
throw new Error("Package not found");
|
|
19
|
+
}
|
|
20
|
+
if (res.status !== 200) {
|
|
21
|
+
throw new Error("Network error");
|
|
22
|
+
}
|
|
23
|
+
return res.data;
|
|
24
|
+
}
|
|
25
|
+
async install(name, version) {
|
|
26
|
+
console.info(`npm install -g ${version ? `${name}@${version}` : name}`);
|
|
27
|
+
await (0, utils_1.exec)(`npm install -g ${version ? `${name}@${version}` : name}`);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.NpmService = NpmService;
|
|
31
|
+
exports.NpmService = NpmService = __decorate([
|
|
32
|
+
(0, core_1.Injectable)()
|
|
33
|
+
], NpmService);
|
|
@@ -49,7 +49,7 @@ let PluginService = class PluginService {
|
|
|
49
49
|
const { default: Plugin } = await Promise.resolve(`${pluginName}`).then(s => __importStar(require(s)));
|
|
50
50
|
const name = Reflect.getMetadata(core_1.PLUGIN_NAME_METADATA, Plugin);
|
|
51
51
|
if (!name) {
|
|
52
|
-
console.
|
|
52
|
+
console.error("No name");
|
|
53
53
|
}
|
|
54
54
|
return !!name;
|
|
55
55
|
}
|
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
import { EnvConfig, Preset,
|
|
1
|
+
import { EnvConfig, Project, Preset, AppConfig, PresetProperties } from "@wocker/core";
|
|
2
|
+
import { AppConfigService } from "./AppConfigService";
|
|
3
|
+
import { LogService } from "./LogService";
|
|
2
4
|
type SearchOptions = Partial<{
|
|
3
5
|
name: string;
|
|
4
6
|
source: string;
|
|
7
|
+
path: string;
|
|
5
8
|
}>;
|
|
6
9
|
export declare class PresetService {
|
|
7
10
|
protected readonly appConfigService: AppConfigService;
|
|
8
|
-
|
|
11
|
+
protected readonly logService: LogService;
|
|
12
|
+
constructor(appConfigService: AppConfigService, logService: LogService);
|
|
9
13
|
protected toObject(config: PresetProperties): Preset;
|
|
10
|
-
protected getList(): Promise<
|
|
11
|
-
|
|
14
|
+
protected getList(): Promise<AppConfig["presets"]>;
|
|
15
|
+
getImageNameForProject(project: Project, preset: Preset): string;
|
|
16
|
+
getImageName(preset: Preset, buildArgs: EnvConfig): string;
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
deinit(): Promise<void>;
|
|
12
19
|
get(name: string): Promise<Preset>;
|
|
13
20
|
addPreset(name: string): Promise<void>;
|
|
14
21
|
search(options?: SearchOptions): Promise<Preset[]>;
|
|
@@ -37,15 +37,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
38
|
exports.PresetService = void 0;
|
|
39
39
|
const core_1 = require("@wocker/core");
|
|
40
|
+
const utils_1 = require("@wocker/utils");
|
|
40
41
|
const md5_1 = __importDefault(require("md5"));
|
|
41
42
|
const axios_1 = __importDefault(require("axios"));
|
|
42
43
|
const unzipper_1 = require("unzipper");
|
|
43
44
|
const Path = __importStar(require("path"));
|
|
45
|
+
const AppConfigService_1 = require("./AppConfigService");
|
|
46
|
+
const LogService_1 = require("./LogService");
|
|
44
47
|
const env_1 = require("../env");
|
|
45
48
|
const makes_1 = require("../makes");
|
|
46
49
|
let PresetService = class PresetService {
|
|
47
|
-
constructor(appConfigService) {
|
|
50
|
+
constructor(appConfigService, logService) {
|
|
48
51
|
this.appConfigService = appConfigService;
|
|
52
|
+
this.logService = logService;
|
|
49
53
|
}
|
|
50
54
|
toObject(config) {
|
|
51
55
|
const _this = this;
|
|
@@ -55,24 +59,32 @@ let PresetService = class PresetService {
|
|
|
55
59
|
}
|
|
56
60
|
async save() {
|
|
57
61
|
const { source, path, ...rest } = this.toJSON();
|
|
58
|
-
const config =
|
|
62
|
+
const config = _this.appConfigService.getConfig();
|
|
59
63
|
let presetData = config.presets.find((presetData) => {
|
|
60
64
|
return presetData.name === this.name;
|
|
61
65
|
});
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
switch (this.source) {
|
|
67
|
+
case core_1.PRESET_SOURCE_EXTERNAL:
|
|
68
|
+
const fs = new core_1.FileSystem(this.path);
|
|
69
|
+
await fs.writeJSON("config.json", rest);
|
|
70
|
+
break;
|
|
71
|
+
case core_1.PRESET_SOURCE_GITHUB: {
|
|
72
|
+
const fs = new core_1.FileSystem(_this.appConfigService.dataPath("presets", this.name));
|
|
73
|
+
if (!fs.exists()) {
|
|
74
|
+
fs.mkdir("");
|
|
75
|
+
}
|
|
76
|
+
await fs.writeJSON("config.json", rest);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
66
79
|
}
|
|
67
|
-
await makes_1.FS.writeJSON(_this.appConfigService.dataPath("presets", this.name, "config.json"), rest);
|
|
68
80
|
if (!presetData) {
|
|
69
|
-
config.registerPreset(this.name, source);
|
|
81
|
+
config.registerPreset(this.name, source, path);
|
|
70
82
|
await config.save();
|
|
71
83
|
}
|
|
72
84
|
}
|
|
73
85
|
async delete() {
|
|
74
86
|
if (this.source === core_1.PRESET_SOURCE_GITHUB) {
|
|
75
|
-
const config =
|
|
87
|
+
const config = _this.appConfigService.getConfig();
|
|
76
88
|
await makes_1.FS.rm(_this.appConfigService.dataPath("presets", this.name), {
|
|
77
89
|
recursive: true
|
|
78
90
|
});
|
|
@@ -84,7 +96,7 @@ let PresetService = class PresetService {
|
|
|
84
96
|
}
|
|
85
97
|
async getList() {
|
|
86
98
|
const dirs = await makes_1.FS.readdir(env_1.PRESETS_DIR);
|
|
87
|
-
const { presets } =
|
|
99
|
+
const { presets } = this.appConfigService.getConfig();
|
|
88
100
|
return [
|
|
89
101
|
...dirs.map((name) => {
|
|
90
102
|
return {
|
|
@@ -93,10 +105,23 @@ let PresetService = class PresetService {
|
|
|
93
105
|
path: Path.join(env_1.PRESETS_DIR, name)
|
|
94
106
|
};
|
|
95
107
|
}),
|
|
96
|
-
...presets
|
|
108
|
+
...presets.map((item) => {
|
|
109
|
+
if (item.source === core_1.PRESET_SOURCE_GITHUB) {
|
|
110
|
+
item.path = this.appConfigService.dataPath("presets", item.name);
|
|
111
|
+
}
|
|
112
|
+
return item;
|
|
113
|
+
})
|
|
97
114
|
];
|
|
98
115
|
}
|
|
99
|
-
|
|
116
|
+
getImageNameForProject(project, preset) {
|
|
117
|
+
switch (project.presetMode) {
|
|
118
|
+
case "project":
|
|
119
|
+
return `project-${project.name}:develop`;
|
|
120
|
+
default:
|
|
121
|
+
return this.getImageName(preset, project.buildArgs || {});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
getImageName(preset, buildArgs) {
|
|
100
125
|
const rawValues = [];
|
|
101
126
|
const hashValues = [];
|
|
102
127
|
Object.keys(preset.buildArgsOptions || {}).forEach((key) => {
|
|
@@ -117,6 +142,117 @@ let PresetService = class PresetService {
|
|
|
117
142
|
}).join("-");
|
|
118
143
|
return `ws-preset-${preset.name}:${version}`;
|
|
119
144
|
}
|
|
145
|
+
async init() {
|
|
146
|
+
let preset = await this.searchOne({
|
|
147
|
+
path: this.appConfigService.pwd()
|
|
148
|
+
});
|
|
149
|
+
const fs = new core_1.FileSystem(this.appConfigService.pwd());
|
|
150
|
+
if (!preset) {
|
|
151
|
+
if (!fs.exists("config.json")) {
|
|
152
|
+
preset = this.toObject({
|
|
153
|
+
name: "",
|
|
154
|
+
version: "",
|
|
155
|
+
source: "external",
|
|
156
|
+
path: this.appConfigService.pwd()
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
preset = this.toObject(fs.readJSON("config.json"));
|
|
161
|
+
preset.source = "external";
|
|
162
|
+
preset.path = this.appConfigService.pwd();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (!preset.name) {
|
|
166
|
+
const list = await this.getList();
|
|
167
|
+
preset.name = await (0, utils_1.promptText)({
|
|
168
|
+
message: "Preset name:",
|
|
169
|
+
required: true,
|
|
170
|
+
validate: async (value) => {
|
|
171
|
+
if (!/^[a-z][a-z0-9-_]+$/.test(value || "")) {
|
|
172
|
+
return "Invalid name";
|
|
173
|
+
}
|
|
174
|
+
const presetData = list.find((presetData) => {
|
|
175
|
+
return presetData.name === value;
|
|
176
|
+
});
|
|
177
|
+
if (presetData) {
|
|
178
|
+
return "Preset name is already taken";
|
|
179
|
+
}
|
|
180
|
+
return true;
|
|
181
|
+
},
|
|
182
|
+
default: preset.name
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (!preset.version) {
|
|
186
|
+
preset.version = await (0, utils_1.promptText)({
|
|
187
|
+
message: "Preset version:",
|
|
188
|
+
validate: (version) => {
|
|
189
|
+
if (!/^[0-9]+\.[0.9]+\.[0-9]+$/.test(version)) {
|
|
190
|
+
return "Invalid version";
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
},
|
|
194
|
+
default: preset.version
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (!preset.type) {
|
|
198
|
+
preset.type = await (0, utils_1.promptSelect)({
|
|
199
|
+
message: "Preset type:",
|
|
200
|
+
options: ["dockerfile", "image"]
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
switch (preset.type) {
|
|
204
|
+
case "dockerfile":
|
|
205
|
+
if (!preset.dockerfile) {
|
|
206
|
+
const files = await fs.readdirFiles();
|
|
207
|
+
const dockerfiles = files.filter((fileName) => {
|
|
208
|
+
if (new RegExp("^(.*)\\.dockerfile$").test(fileName)) {
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
return new RegExp("^Dockerfile(\\..*)?").test(fileName);
|
|
212
|
+
});
|
|
213
|
+
if (dockerfiles.length === 0) {
|
|
214
|
+
throw new Error("No dockerfiles found");
|
|
215
|
+
}
|
|
216
|
+
preset.dockerfile = await (0, utils_1.promptSelect)({
|
|
217
|
+
message: "Preset dockerfile:",
|
|
218
|
+
options: dockerfiles
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
break;
|
|
222
|
+
case "image":
|
|
223
|
+
if (preset.image) {
|
|
224
|
+
preset.image = await (0, utils_1.promptText)({
|
|
225
|
+
message: "Preset image:",
|
|
226
|
+
required: true,
|
|
227
|
+
validate(value) {
|
|
228
|
+
if (!/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?::[a-z0-9]+(?:[._-][a-z0-9]+)*)?$/.test(value)) {
|
|
229
|
+
return "Invalid image name";
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
console.info(JSON.stringify(preset.toJSON(), null, 4));
|
|
238
|
+
const confirm = await (0, utils_1.promptConfirm)({
|
|
239
|
+
message: "Correct?"
|
|
240
|
+
});
|
|
241
|
+
if (confirm) {
|
|
242
|
+
await preset.save();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async deinit() {
|
|
246
|
+
const preset = await this.searchOne({
|
|
247
|
+
path: this.appConfigService.pwd()
|
|
248
|
+
});
|
|
249
|
+
if (!preset) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const config = this.appConfigService.getConfig();
|
|
253
|
+
config.unregisterPreset(preset.name);
|
|
254
|
+
await config.save();
|
|
255
|
+
}
|
|
120
256
|
async get(name) {
|
|
121
257
|
const list = await this.getList();
|
|
122
258
|
const item = list.find((item) => {
|
|
@@ -125,12 +261,6 @@ let PresetService = class PresetService {
|
|
|
125
261
|
if (!item) {
|
|
126
262
|
throw new Error(`Preset ${name} not found`);
|
|
127
263
|
}
|
|
128
|
-
if (item.source === core_1.PRESET_SOURCE_GITHUB) {
|
|
129
|
-
item.path = this.appConfigService.dataPath("presets", item.name);
|
|
130
|
-
}
|
|
131
|
-
else if (item.source === core_1.PRESET_SOURCE_INTERNAL) {
|
|
132
|
-
item.path = Path.join(env_1.PRESETS_DIR, item.name);
|
|
133
|
-
}
|
|
134
264
|
const config = await makes_1.FS.readJSON(item.path, "config.json");
|
|
135
265
|
return this.toObject({
|
|
136
266
|
...item,
|
|
@@ -180,7 +310,7 @@ let PresetService = class PresetService {
|
|
|
180
310
|
console.log(preset.version);
|
|
181
311
|
}
|
|
182
312
|
async search(options = {}) {
|
|
183
|
-
const { name, source } = options;
|
|
313
|
+
const { name, source, path } = options;
|
|
184
314
|
const presets = [];
|
|
185
315
|
const presetConfigs = await this.getList();
|
|
186
316
|
for (const presetConfig of presetConfigs) {
|
|
@@ -190,11 +320,11 @@ let PresetService = class PresetService {
|
|
|
190
320
|
if (source && source !== presetConfig.source) {
|
|
191
321
|
continue;
|
|
192
322
|
}
|
|
323
|
+
if (path && path !== presetConfig.path) {
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
193
326
|
try {
|
|
194
327
|
const fullConfig = await makes_1.FS.readJSON(presetConfig.path, "config.json");
|
|
195
|
-
if (!fullConfig.name) {
|
|
196
|
-
console.log(presetConfig.name);
|
|
197
|
-
}
|
|
198
328
|
const preset = this.toObject({
|
|
199
329
|
...presetConfig,
|
|
200
330
|
...fullConfig
|
|
@@ -202,6 +332,7 @@ let PresetService = class PresetService {
|
|
|
202
332
|
presets.push(preset);
|
|
203
333
|
}
|
|
204
334
|
catch (err) {
|
|
335
|
+
this.logService.error("PresetService.search(", options, ") ->", err.message);
|
|
205
336
|
}
|
|
206
337
|
}
|
|
207
338
|
return presets;
|
|
@@ -214,5 +345,6 @@ let PresetService = class PresetService {
|
|
|
214
345
|
exports.PresetService = PresetService;
|
|
215
346
|
exports.PresetService = PresetService = __decorate([
|
|
216
347
|
(0, core_1.Injectable)(),
|
|
217
|
-
__metadata("design:paramtypes", [
|
|
348
|
+
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService,
|
|
349
|
+
LogService_1.LogService])
|
|
218
350
|
], PresetService);
|
|
@@ -1,40 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
7
|
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
-
if (mod && mod.__esModule) return mod;
|
|
26
|
-
var result = {};
|
|
27
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
-
__setModuleDefault(result, mod);
|
|
29
|
-
return result;
|
|
30
|
-
};
|
|
31
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
32
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
10
|
};
|
|
34
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
12
|
exports.ProjectService = void 0;
|
|
36
13
|
const core_1 = require("@wocker/core");
|
|
37
|
-
const Path = __importStar(require("path"));
|
|
38
14
|
const makes_1 = require("../makes");
|
|
39
15
|
const services_1 = require("../services");
|
|
40
16
|
let ProjectService = class ProjectService {
|
|
@@ -56,7 +32,7 @@ let ProjectService = class ProjectService {
|
|
|
56
32
|
}
|
|
57
33
|
async get() {
|
|
58
34
|
const project = await this.searchOne({
|
|
59
|
-
path: this.appConfigService.
|
|
35
|
+
path: this.appConfigService.pwd()
|
|
60
36
|
});
|
|
61
37
|
if (!project) {
|
|
62
38
|
throw new Error("Project not found");
|
|
@@ -64,8 +40,13 @@ let ProjectService = class ProjectService {
|
|
|
64
40
|
return project;
|
|
65
41
|
}
|
|
66
42
|
async getById(id) {
|
|
43
|
+
const config = this.appConfigService.getConfig();
|
|
44
|
+
const projectData = config.getProject(id);
|
|
67
45
|
const data = await makes_1.FS.readJSON(this.appConfigService.dataPath("projects", id, "config.json"));
|
|
68
|
-
return this.fromObject(
|
|
46
|
+
return this.fromObject({
|
|
47
|
+
...data,
|
|
48
|
+
path: projectData.path || projectData.src
|
|
49
|
+
});
|
|
69
50
|
}
|
|
70
51
|
async cdProject(name) {
|
|
71
52
|
const project = await this.searchOne({
|
|
@@ -96,7 +77,7 @@ let ProjectService = class ProjectService {
|
|
|
96
77
|
await this.dockerService.buildImage({
|
|
97
78
|
tag: project.imageName,
|
|
98
79
|
buildArgs: project.buildArgs,
|
|
99
|
-
context: this.appConfigService.
|
|
80
|
+
context: this.appConfigService.pwd(),
|
|
100
81
|
src: project.dockerfile
|
|
101
82
|
});
|
|
102
83
|
}
|
|
@@ -105,7 +86,7 @@ let ProjectService = class ProjectService {
|
|
|
105
86
|
await this.appEventsService.emit("project:rebuild", project);
|
|
106
87
|
}
|
|
107
88
|
await this.appEventsService.emit("project:beforeStart", project);
|
|
108
|
-
const config =
|
|
89
|
+
const config = this.appConfigService.getConfig();
|
|
109
90
|
container = await this.dockerService.createContainer({
|
|
110
91
|
name: project.containerName,
|
|
111
92
|
image: project.imageName,
|
|
@@ -113,12 +94,18 @@ let ProjectService = class ProjectService {
|
|
|
113
94
|
...config.env || {},
|
|
114
95
|
...project.env || {}
|
|
115
96
|
},
|
|
97
|
+
ports: project.ports || [],
|
|
116
98
|
volumes: (project.volumes || []).map((volume) => {
|
|
117
99
|
const regVolume = /^([^:]+):([^:]+)(?::([^:]+))?$/;
|
|
118
100
|
const [, source, destination, options] = regVolume.exec(volume);
|
|
119
|
-
|
|
101
|
+
if (source.startsWith("/")) {
|
|
102
|
+
return volume;
|
|
103
|
+
}
|
|
104
|
+
return `${this.appConfigService.pwd(source)}:${destination}` + (options ? `:${options}` : "");
|
|
120
105
|
}),
|
|
121
|
-
|
|
106
|
+
extraHosts: Object.keys(project.extraHosts || {}).map((host) => {
|
|
107
|
+
return `${project.extraHosts[host]}:${host}`;
|
|
108
|
+
})
|
|
122
109
|
});
|
|
123
110
|
}
|
|
124
111
|
const { State: { Status } } = await container.inspect();
|
|
@@ -145,27 +132,25 @@ let ProjectService = class ProjectService {
|
|
|
145
132
|
if (!project.id) {
|
|
146
133
|
project.id = project.name;
|
|
147
134
|
}
|
|
148
|
-
const projectDirPath = this.appConfigService.dataPath("projects", project.id);
|
|
149
135
|
const config = await this.appConfigService.getConfig();
|
|
150
|
-
const
|
|
151
|
-
if (!
|
|
152
|
-
|
|
153
|
-
recursive: true
|
|
154
|
-
});
|
|
136
|
+
const fs = new core_1.FileSystem(this.appConfigService.dataPath("projects", project.id));
|
|
137
|
+
if (!fs.exists()) {
|
|
138
|
+
fs.mkdir("", { recursive: true });
|
|
155
139
|
}
|
|
156
|
-
|
|
157
|
-
|
|
140
|
+
const { path, ...rest } = project.toJSON();
|
|
141
|
+
config.addProject(project.id, project.name, path);
|
|
142
|
+
await fs.writeJSON("config.json", rest);
|
|
158
143
|
await config.save();
|
|
159
144
|
}
|
|
160
145
|
async search(params = {}) {
|
|
161
|
-
const {
|
|
146
|
+
const { name, path } = params;
|
|
162
147
|
const config = await this.appConfigService.getConfig();
|
|
163
148
|
const projects = [];
|
|
164
149
|
for (const projectConfig of config.projects) {
|
|
165
|
-
if (
|
|
150
|
+
if (name && projectConfig.name !== name) {
|
|
166
151
|
continue;
|
|
167
152
|
}
|
|
168
|
-
if (path && projectConfig.src !== path) {
|
|
153
|
+
if (path && (projectConfig.path || projectConfig.src) !== path) {
|
|
169
154
|
continue;
|
|
170
155
|
}
|
|
171
156
|
const project = await this.getById(projectConfig.id);
|
|
@@ -46,7 +46,7 @@ let ProxyService = class ProxyService {
|
|
|
46
46
|
mode: 0o700
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
|
-
const config =
|
|
49
|
+
const config = this.appConfigService.getConfig();
|
|
50
50
|
const httpPort = config.getMeta("PROXY_HTTP_PORT", "80");
|
|
51
51
|
const httpsPort = config.getMeta("PROXY_HTTPS_PORT", "443");
|
|
52
52
|
container = await this.dockerService.createContainer({
|
|
@@ -65,11 +65,11 @@ let ProxyService = class ProxyService {
|
|
|
65
65
|
`${certsDir}:/etc/nginx/certs`
|
|
66
66
|
]
|
|
67
67
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
}
|
|
69
|
+
const { State: { Status } } = await container.inspect();
|
|
70
|
+
if (["created", "exited"].includes(Status)) {
|
|
71
|
+
await container.start();
|
|
72
|
+
console.info("Proxy started");
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
async stop() {
|
package/lib/services/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from "./AppConfigService";
|
|
|
2
2
|
export * from "./AppEventsService";
|
|
3
3
|
export * from "./DockerService";
|
|
4
4
|
export * from "./LogService";
|
|
5
|
+
export * from "./NpmService";
|
|
5
6
|
export * from "./PluginService";
|
|
6
7
|
export * from "./PresetService";
|
|
7
8
|
export * from "./ProjectService";
|
package/lib/services/index.js
CHANGED
|
@@ -18,6 +18,7 @@ __exportStar(require("./AppConfigService"), exports);
|
|
|
18
18
|
__exportStar(require("./AppEventsService"), exports);
|
|
19
19
|
__exportStar(require("./DockerService"), exports);
|
|
20
20
|
__exportStar(require("./LogService"), exports);
|
|
21
|
+
__exportStar(require("./NpmService"), exports);
|
|
21
22
|
__exportStar(require("./PluginService"), exports);
|
|
22
23
|
__exportStar(require("./PresetService"), exports);
|
|
23
24
|
__exportStar(require("./ProjectService"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type PackageInfo = {
|
|
2
|
+
name: string;
|
|
3
|
+
"dist-tags": {
|
|
4
|
+
[tag: string]: string;
|
|
5
|
+
};
|
|
6
|
+
versions: {
|
|
7
|
+
[version: string]: {
|
|
8
|
+
name: string;
|
|
9
|
+
version: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
time: {
|
|
13
|
+
created: string;
|
|
14
|
+
modified: string;
|
|
15
|
+
} & {
|
|
16
|
+
[version: string]: string;
|
|
17
|
+
};
|
|
18
|
+
readme: string;
|
|
19
|
+
readmeFilename: string;
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./PackageInfo";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./PackageInfo"), exports);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wocker/ws",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.17",
|
|
4
4
|
"author": "Kris Papercut <krispcut@gmail.com>",
|
|
5
5
|
"description": "Docker workspace for web projects",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"lint": "eslint \"**/*.{js,jsx,ts,tsx}\""
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@wocker/core": "
|
|
29
|
-
"@wocker/utils": "^1.0.
|
|
28
|
+
"@wocker/core": "1.0.17",
|
|
29
|
+
"@wocker/utils": "^1.0.7",
|
|
30
30
|
"async-mutex": "^0.4.0",
|
|
31
31
|
"axios": "^1.6.7",
|
|
32
32
|
"chalk": "^2.4.2",
|