@wocker/ws 1.0.21 → 1.0.23
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/README.md +8 -0
- package/lib/AppModule.js +46 -75
- package/lib/controllers/DebugController.d.ts +4 -2
- package/lib/controllers/DebugController.js +19 -11
- package/lib/controllers/ExperimentalController.d.ts +8 -0
- package/lib/controllers/ExperimentalController.js +77 -0
- package/lib/controllers/PluginController.d.ts +4 -5
- package/lib/controllers/PluginController.js +14 -59
- package/lib/controllers/PresetController.d.ts +9 -3
- package/lib/controllers/PresetController.js +61 -52
- package/lib/controllers/ProjectController.d.ts +7 -2
- package/lib/controllers/ProjectController.js +124 -94
- package/lib/controllers/index.d.ts +1 -3
- package/lib/controllers/index.js +1 -3
- package/lib/env.d.ts +2 -2
- package/lib/env.js +3 -3
- package/lib/main.js +16 -7
- package/lib/makes/GithubClient.d.ts +14 -0
- package/lib/makes/GithubClient.js +65 -0
- package/lib/makes/Logger.d.ts +1 -1
- package/lib/makes/Plugin.d.ts +5 -0
- package/lib/makes/Plugin.js +15 -0
- package/lib/makes/index.d.ts +1 -1
- package/lib/makes/index.js +1 -1
- package/lib/modules/app/index.d.ts +2 -0
- package/lib/{plugins/proxmox → modules/app}/index.js +6 -13
- package/lib/modules/docker/index.d.ts +8 -0
- package/lib/modules/docker/index.js +41 -0
- package/lib/modules/docker/services/ContainerService.d.ts +14 -0
- package/lib/modules/docker/services/ContainerService.js +115 -0
- package/lib/{services → modules/docker/services}/DockerService.d.ts +12 -5
- package/lib/{services → modules/docker/services}/DockerService.js +33 -117
- package/lib/modules/docker/services/ImageService.d.ts +18 -0
- package/lib/modules/docker/services/ImageService.js +68 -0
- package/lib/modules/docker/services/ModemService.d.ts +14 -0
- package/lib/modules/docker/services/ModemService.js +137 -0
- package/lib/modules/docker/services/ProtoService.d.ts +6 -0
- package/lib/modules/docker/services/ProtoService.js +20 -0
- package/lib/modules/index.d.ts +3 -0
- package/lib/{plugins → modules}/index.js +3 -3
- package/lib/modules/keystore/controllers/KeystoreController.d.ts +11 -0
- package/lib/modules/keystore/controllers/KeystoreController.js +106 -0
- package/lib/modules/keystore/index.d.ts +4 -0
- package/lib/{plugins/elastic-search → modules/keystore}/index.js +16 -9
- package/lib/modules/keystore/providers/FileKeystoreProvider.d.ts +16 -0
- package/lib/modules/keystore/providers/FileKeystoreProvider.js +97 -0
- package/lib/modules/keystore/providers/KeytarKeystoreProvider.d.ts +9 -0
- package/lib/modules/keystore/providers/KeytarKeystoreProvider.js +74 -0
- package/lib/modules/keystore/services/KeystoreService.d.ts +12 -0
- package/lib/modules/keystore/services/KeystoreService.js +70 -0
- package/lib/modules/keystore/types/FileKeystore.d.ts +17 -0
- package/lib/modules/keystore/types/FileKeystore.js +33 -0
- package/lib/modules/keystore/types/Keytar.d.ts +8 -0
- package/lib/modules/keystore/types/Keytar.js +2 -0
- package/lib/modules/keystore/utils/createEncryptionKey.d.ts +1 -0
- package/lib/modules/keystore/utils/createEncryptionKey.js +46 -0
- package/lib/modules/keystore/utils/createPasswordHash.d.ts +1 -0
- package/lib/modules/keystore/utils/createPasswordHash.js +20 -0
- package/lib/modules/keystore/utils/decrypt.d.ts +1 -0
- package/lib/modules/keystore/utils/decrypt.js +15 -0
- package/lib/modules/keystore/utils/encrypt.d.ts +1 -0
- package/lib/modules/keystore/utils/encrypt.js +19 -0
- package/lib/modules/keystore/utils/index.d.ts +5 -0
- package/lib/{services → modules/keystore/utils}/index.js +5 -10
- package/lib/modules/keystore/utils/verifyPasswordHash.d.ts +1 -0
- package/lib/modules/keystore/utils/verifyPasswordHash.js +9 -0
- package/lib/{controllers → modules/proxy/controllers}/CertController.d.ts +2 -1
- package/lib/{controllers → modules/proxy/controllers}/CertController.js +4 -3
- package/lib/{controllers → modules/proxy/controllers}/ProxyController.d.ts +4 -1
- package/lib/{controllers → modules/proxy/controllers}/ProxyController.js +46 -37
- package/lib/modules/proxy/index.d.ts +5 -0
- package/lib/modules/proxy/index.js +39 -0
- package/lib/{services → modules/proxy/services}/CertService.d.ts +3 -3
- package/lib/{services → modules/proxy/services}/CertService.js +11 -11
- package/lib/{services → modules/proxy/services}/ProxyService.d.ts +2 -2
- package/lib/{services → modules/proxy/services}/ProxyService.js +21 -13
- package/lib/repositories/PresetRepository.d.ts +23 -0
- package/lib/repositories/PresetRepository.js +115 -0
- package/lib/repositories/index.d.ts +1 -0
- package/lib/repositories/index.js +17 -0
- package/lib/services/AppConfigService.d.ts +6 -2
- package/lib/services/AppConfigService.js +60 -53
- package/lib/services/AppEventsService.d.ts +4 -4
- package/lib/services/AppEventsService.js +14 -10
- package/lib/services/LogService.d.ts +3 -1
- package/lib/services/LogService.js +12 -10
- package/lib/services/PluginService.d.ts +8 -2
- package/lib/services/PluginService.js +69 -16
- package/lib/services/PresetService.d.ts +9 -8
- package/lib/services/PresetService.js +145 -260
- package/lib/services/ProjectService.d.ts +8 -5
- package/lib/services/ProjectService.js +44 -18
- package/lib/utils/followProgress2.d.ts +1 -0
- package/lib/utils/followProgress2.js +63 -0
- package/lib/utils/index.d.ts +1 -4
- package/lib/utils/index.js +1 -4
- package/package.json +24 -15
- package/proto/buildkit.proto +55 -0
- package/proto/solver/pb/ops.proto +443 -0
- package/lib/controllers/ImageController.d.ts +0 -7
- package/lib/controllers/ImageController.js +0 -46
- package/lib/makes/FS.d.ts +0 -27
- package/lib/makes/FS.js +0 -284
- package/lib/makes/LineConvertStream.d.ts +0 -11
- package/lib/makes/LineConvertStream.js +0 -42
- package/lib/makes/Model.d.ts +0 -5
- package/lib/makes/Model.js +0 -12
- package/lib/plugins/MongodbPlugin.d.ts +0 -20
- package/lib/plugins/MongodbPlugin.js +0 -288
- package/lib/plugins/elastic-search/controllers/ElasticSearchController.d.ts +0 -10
- package/lib/plugins/elastic-search/controllers/ElasticSearchController.js +0 -91
- package/lib/plugins/elastic-search/index.d.ts +0 -2
- package/lib/plugins/index.d.ts +0 -3
- package/lib/plugins/proxmox/controllers/ProxmoxController.d.ts +0 -14
- package/lib/plugins/proxmox/controllers/ProxmoxController.js +0 -127
- package/lib/plugins/proxmox/index.d.ts +0 -2
- package/lib/services/index.d.ts +0 -10
- package/lib/utils/followProgress.d.ts +0 -1
- package/lib/utils/followProgress.js +0 -73
- package/lib/utils/volumeFormat.d.ts +0 -6
- package/lib/utils/volumeFormat.js +0 -8
- package/lib/utils/volumeParse.d.ts +0 -2
- package/lib/utils/volumeParse.js +0 -13
- package/presets/bun/Dockerfile +0 -11
- package/presets/bun/config.json +0 -4
- /package/lib/{utils/format-size-units.d.ts → modules/docker/utils/formatSizeUnits.d.ts} +0 -0
- /package/lib/{utils/format-size-units.js → modules/docker/utils/formatSizeUnits.js} +0 -0
|
@@ -1,43 +1,10 @@
|
|
|
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 () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
10
|
};
|
|
@@ -49,79 +16,78 @@ exports.PresetService = void 0;
|
|
|
49
16
|
const core_1 = require("@wocker/core");
|
|
50
17
|
const utils_1 = require("@wocker/utils");
|
|
51
18
|
const md5_1 = __importDefault(require("md5"));
|
|
52
|
-
const axios_1 = __importDefault(require("axios"));
|
|
53
|
-
const unzipper_1 = require("unzipper");
|
|
54
|
-
const Path = __importStar(require("path"));
|
|
55
19
|
const AppConfigService_1 = require("./AppConfigService");
|
|
56
20
|
const LogService_1 = require("./LogService");
|
|
57
|
-
const
|
|
58
|
-
const
|
|
21
|
+
const PresetRepository_1 = require("../repositories/PresetRepository");
|
|
22
|
+
const GithubClient_1 = require("../makes/GithubClient");
|
|
59
23
|
let PresetService = class PresetService {
|
|
60
|
-
constructor(appConfigService, logService) {
|
|
24
|
+
constructor(appConfigService, presetRepository, logService) {
|
|
61
25
|
this.appConfigService = appConfigService;
|
|
26
|
+
this.presetRepository = presetRepository;
|
|
62
27
|
this.logService = logService;
|
|
63
28
|
}
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
29
|
+
async prompt(configMap, values = {}) {
|
|
30
|
+
for (const name in configMap) {
|
|
31
|
+
const config = configMap[name];
|
|
32
|
+
switch (config.type) {
|
|
33
|
+
case "boolean": {
|
|
34
|
+
const value = await (0, utils_1.promptConfirm)({
|
|
35
|
+
message: config.message,
|
|
36
|
+
required: config.required,
|
|
37
|
+
default: typeof values[name] !== "undefined" && values[name] === "true"
|
|
38
|
+
? true
|
|
39
|
+
: undefined,
|
|
40
|
+
});
|
|
41
|
+
values[name] = value.toString();
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case "select": {
|
|
45
|
+
const result = await (0, utils_1.promptSelect)({
|
|
46
|
+
required: config.required,
|
|
47
|
+
multiple: config.multiple,
|
|
48
|
+
message: config.message,
|
|
49
|
+
options: config.options,
|
|
50
|
+
default: values[name]
|
|
51
|
+
});
|
|
52
|
+
if (!config.multiple) {
|
|
53
|
+
values[name] = result;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const options = (0, utils_1.normalizeOptions)(config.options);
|
|
57
|
+
for (const option of options) {
|
|
58
|
+
if (result.includes(option.value)) {
|
|
59
|
+
values[option.value] = "true";
|
|
60
|
+
}
|
|
61
|
+
else if (option.value in values) {
|
|
62
|
+
delete values[option.value];
|
|
63
|
+
}
|
|
85
64
|
}
|
|
86
|
-
fs.writeJSON("config.json", rest);
|
|
87
|
-
break;
|
|
88
65
|
}
|
|
66
|
+
break;
|
|
89
67
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
await
|
|
68
|
+
case "int":
|
|
69
|
+
case "number": {
|
|
70
|
+
const result = await (0, utils_1.promptInput)({
|
|
71
|
+
...config,
|
|
72
|
+
type: "number",
|
|
73
|
+
default: values[name] || config.default
|
|
74
|
+
});
|
|
75
|
+
values[name] = result.toString();
|
|
76
|
+
break;
|
|
93
77
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
78
|
+
case "string":
|
|
79
|
+
case "text":
|
|
80
|
+
case "password": {
|
|
81
|
+
values[name] = await (0, utils_1.promptInput)({
|
|
82
|
+
...config,
|
|
83
|
+
type: config.type === "string" ? "text" : config.type,
|
|
84
|
+
default: values[name] || config.default
|
|
100
85
|
});
|
|
101
|
-
|
|
102
|
-
await config.save();
|
|
86
|
+
break;
|
|
103
87
|
}
|
|
104
88
|
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
async getList() {
|
|
108
|
-
const dirs = await makes_1.FS.readdir(env_1.PRESETS_DIR);
|
|
109
|
-
const { presets = [] } = this.appConfigService.getConfig();
|
|
110
|
-
return [
|
|
111
|
-
...dirs.map((name) => {
|
|
112
|
-
return {
|
|
113
|
-
name,
|
|
114
|
-
source: core_1.PRESET_SOURCE_INTERNAL,
|
|
115
|
-
path: Path.join(env_1.PRESETS_DIR, name)
|
|
116
|
-
};
|
|
117
|
-
}),
|
|
118
|
-
...presets.map((item) => {
|
|
119
|
-
if (item.source === core_1.PRESET_SOURCE_GITHUB) {
|
|
120
|
-
item.path = this.appConfigService.dataPath("presets", item.name);
|
|
121
|
-
}
|
|
122
|
-
return item;
|
|
123
|
-
})
|
|
124
|
-
];
|
|
89
|
+
}
|
|
90
|
+
return values;
|
|
125
91
|
}
|
|
126
92
|
getImageNameForProject(project, preset) {
|
|
127
93
|
switch (project.presetMode) {
|
|
@@ -132,8 +98,7 @@ let PresetService = class PresetService {
|
|
|
132
98
|
}
|
|
133
99
|
}
|
|
134
100
|
getImageName(preset, buildArgs) {
|
|
135
|
-
const rawValues = [];
|
|
136
|
-
const hashValues = [];
|
|
101
|
+
const rawValues = [], hashValues = [];
|
|
137
102
|
Object.keys(preset.buildArgsOptions || {}).forEach((key) => {
|
|
138
103
|
const hash = (preset.buildArgsOptions[key] || {}).hash || true;
|
|
139
104
|
const value = buildArgs[key];
|
|
@@ -153,208 +118,128 @@ let PresetService = class PresetService {
|
|
|
153
118
|
return `ws-preset-${preset.name}:${version}`;
|
|
154
119
|
}
|
|
155
120
|
async init() {
|
|
156
|
-
|
|
121
|
+
const fs = new core_1.FileSystem(this.appConfigService.pwd());
|
|
122
|
+
let preset = this.presetRepository.searchOne({
|
|
157
123
|
path: this.appConfigService.pwd()
|
|
158
124
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (!fs.exists("config.json")) {
|
|
162
|
-
preset = this.toObject({
|
|
163
|
-
name: "",
|
|
164
|
-
version: "",
|
|
165
|
-
source: "external",
|
|
166
|
-
path: this.appConfigService.pwd()
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
preset = this.toObject(fs.readJSON("config.json"));
|
|
171
|
-
preset.source = "external";
|
|
172
|
-
preset.path = this.appConfigService.pwd();
|
|
173
|
-
}
|
|
125
|
+
if (preset) {
|
|
126
|
+
return;
|
|
174
127
|
}
|
|
175
|
-
if (
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
required: true,
|
|
180
|
-
validate: async (value) => {
|
|
181
|
-
if (!/^[a-z][a-z0-9-_]+$/.test(value || "")) {
|
|
182
|
-
return "Invalid name";
|
|
183
|
-
}
|
|
184
|
-
const presetData = list.find((presetData) => {
|
|
185
|
-
return presetData.name === value;
|
|
186
|
-
});
|
|
187
|
-
if (presetData) {
|
|
188
|
-
return "Preset name is already taken";
|
|
189
|
-
}
|
|
190
|
-
return true;
|
|
191
|
-
},
|
|
192
|
-
default: preset.name
|
|
193
|
-
});
|
|
128
|
+
if (fs.exists("config.json")) {
|
|
129
|
+
const config = fs.readJSON("config.json");
|
|
130
|
+
this.appConfigService.registerPreset(config.name, core_1.PRESET_SOURCE_EXTERNAL, fs.path());
|
|
131
|
+
return;
|
|
194
132
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
}
|
|
133
|
+
let config = {};
|
|
134
|
+
config.name = await (0, utils_1.promptInput)({
|
|
135
|
+
message: "Preset name",
|
|
136
|
+
required: true,
|
|
137
|
+
validate: (name) => {
|
|
138
|
+
if (!name || typeof name !== "string") {
|
|
202
139
|
return true;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
140
|
+
}
|
|
141
|
+
if (this.presetRepository.searchOne({ name })) {
|
|
142
|
+
return "Preset name already taken";
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
config.version = await (0, utils_1.promptInput)({
|
|
148
|
+
message: "Preset version",
|
|
149
|
+
validate: (version) => {
|
|
150
|
+
if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.test(version)) {
|
|
151
|
+
return "Invalid version";
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
config.type = await (0, utils_1.promptSelect)({
|
|
157
|
+
message: "Preset type",
|
|
158
|
+
options: ["dockerfile", "image"]
|
|
159
|
+
});
|
|
160
|
+
switch (config.type) {
|
|
214
161
|
case "dockerfile":
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return true;
|
|
220
|
-
}
|
|
221
|
-
return new RegExp("^Dockerfile(\\..*)?").test(fileName);
|
|
222
|
-
});
|
|
223
|
-
if (dockerfiles.length === 0) {
|
|
224
|
-
throw new Error("No dockerfiles found");
|
|
162
|
+
const files = await fs.readdirFiles();
|
|
163
|
+
const dockerfiles = files.filter((fileName) => {
|
|
164
|
+
if (new RegExp("^(.*)\\.dockerfile$").test(fileName)) {
|
|
165
|
+
return true;
|
|
225
166
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
167
|
+
return new RegExp("^Dockerfile(\\..*)?").test(fileName);
|
|
168
|
+
});
|
|
169
|
+
if (dockerfiles.length === 0) {
|
|
170
|
+
throw new Error("No dockerfiles found");
|
|
230
171
|
}
|
|
172
|
+
config.dockerfile = await (0, utils_1.promptSelect)({
|
|
173
|
+
message: "Preset dockerfile",
|
|
174
|
+
options: dockerfiles
|
|
175
|
+
});
|
|
231
176
|
break;
|
|
232
177
|
case "image":
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
return "Invalid image name";
|
|
240
|
-
}
|
|
241
|
-
return true;
|
|
178
|
+
config.image = await (0, utils_1.promptInput)({
|
|
179
|
+
message: "Preset image",
|
|
180
|
+
required: true,
|
|
181
|
+
validate(value) {
|
|
182
|
+
if (!/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?::[a-z0-9]+(?:[._-][a-z0-9]+)*)?$/.test(value)) {
|
|
183
|
+
return "Invalid image name";
|
|
242
184
|
}
|
|
243
|
-
|
|
244
|
-
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
245
188
|
break;
|
|
246
189
|
}
|
|
247
|
-
console.info(JSON.stringify(
|
|
190
|
+
console.info(JSON.stringify(config, null, 4));
|
|
248
191
|
const confirm = await (0, utils_1.promptConfirm)({
|
|
249
|
-
message: "Correct
|
|
192
|
+
message: "Correct",
|
|
193
|
+
default: true
|
|
250
194
|
});
|
|
251
|
-
if (confirm) {
|
|
252
|
-
|
|
195
|
+
if (!confirm) {
|
|
196
|
+
return;
|
|
253
197
|
}
|
|
198
|
+
fs.writeJSON("config.json", config);
|
|
199
|
+
this.appConfigService.registerPreset(config.name, core_1.PRESET_SOURCE_EXTERNAL, fs.path());
|
|
254
200
|
}
|
|
255
201
|
async deinit() {
|
|
256
|
-
const preset =
|
|
202
|
+
const preset = this.presetRepository.searchOne({
|
|
257
203
|
path: this.appConfigService.pwd()
|
|
258
204
|
});
|
|
259
205
|
if (!preset) {
|
|
260
206
|
return;
|
|
261
207
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
await config.save();
|
|
208
|
+
this.appConfigService.config.unregisterPreset(preset.name);
|
|
209
|
+
this.appConfigService.save();
|
|
265
210
|
}
|
|
266
|
-
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
throw new Error(`Preset ${name} not found`);
|
|
211
|
+
get(name) {
|
|
212
|
+
const preset = name
|
|
213
|
+
? this.presetRepository.searchOne({ name })
|
|
214
|
+
: this.presetRepository.searchOne({ path: this.appConfigService.pwd() });
|
|
215
|
+
if (!preset) {
|
|
216
|
+
throw new Error(name ? `Preset "${name}" not found` : "Preset not found");
|
|
273
217
|
}
|
|
274
|
-
|
|
275
|
-
return this.toObject({
|
|
276
|
-
...item,
|
|
277
|
-
...config
|
|
278
|
-
});
|
|
218
|
+
return preset;
|
|
279
219
|
}
|
|
280
|
-
async addPreset(name, version) {
|
|
281
|
-
let preset =
|
|
220
|
+
async addPreset(name, repository, version) {
|
|
221
|
+
let preset = this.presetRepository.searchOne({
|
|
282
222
|
name
|
|
283
223
|
});
|
|
284
224
|
if (!preset) {
|
|
285
225
|
console.info("Loading...");
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
.send(`/kearisp/wocker-${name}-preset/master/config.json`);
|
|
289
|
-
preset = this.toObject(res.data);
|
|
290
|
-
preset.source = core_1.PRESET_SOURCE_GITHUB;
|
|
291
|
-
preset.path = this.appConfigService.dataPath("presets", preset.name);
|
|
292
|
-
const zipRes = await axios_1.default.create({
|
|
293
|
-
baseURL: "https://github.com",
|
|
294
|
-
headers: {
|
|
295
|
-
"User-Agent": "Wocker"
|
|
296
|
-
}
|
|
297
|
-
}).get(`/kearisp/wocker-${preset.name}-preset/archive/refs/heads/master.zip`, {
|
|
298
|
-
responseType: "stream"
|
|
299
|
-
});
|
|
300
|
-
makes_1.FS.mkdirSync(preset.path, {
|
|
301
|
-
recursive: true
|
|
302
|
-
});
|
|
303
|
-
zipRes.data.pipe((0, unzipper_1.Parse)()).on("entry", (entry) => {
|
|
304
|
-
const path = entry.path.replace(/^[^\/]+\//, "");
|
|
305
|
-
if (path === "config.json") {
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
const fullPath = this.appConfigService.dataPath("presets", preset.name, path);
|
|
309
|
-
if (entry.type === "File") {
|
|
310
|
-
entry.pipe(makes_1.FS.createWriteStream(fullPath));
|
|
311
|
-
}
|
|
312
|
-
else if (entry.type === "Directory") {
|
|
313
|
-
makes_1.FS.mkdirSync(fullPath, {
|
|
314
|
-
recursive: true
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
});
|
|
318
|
-
await preset.save();
|
|
319
|
-
}
|
|
320
|
-
console.log(preset.version);
|
|
321
|
-
}
|
|
322
|
-
async search(options = {}) {
|
|
323
|
-
const { name, source, path } = options;
|
|
324
|
-
const presets = [];
|
|
325
|
-
const presetConfigs = await this.getList();
|
|
326
|
-
for (const presetConfig of presetConfigs) {
|
|
327
|
-
if (name && name !== presetConfig.name) {
|
|
328
|
-
continue;
|
|
329
|
-
}
|
|
330
|
-
if (source && source !== presetConfig.source) {
|
|
331
|
-
continue;
|
|
332
|
-
}
|
|
333
|
-
if (path && path !== presetConfig.path) {
|
|
334
|
-
continue;
|
|
335
|
-
}
|
|
336
|
-
try {
|
|
337
|
-
const fullConfig = await makes_1.FS.readJSON(presetConfig.path, "config.json");
|
|
338
|
-
const preset = this.toObject({
|
|
339
|
-
...presetConfig,
|
|
340
|
-
...fullConfig
|
|
341
|
-
});
|
|
342
|
-
presets.push(preset);
|
|
343
|
-
}
|
|
344
|
-
catch (err) {
|
|
345
|
-
this.logService.error("PresetService.search(", options, ") ->", err.message);
|
|
226
|
+
if (!repository) {
|
|
227
|
+
repository = `kearisp/wocker-${name}-preset`;
|
|
346
228
|
}
|
|
229
|
+
const [owner, repo] = repository.split("/");
|
|
230
|
+
const github = new GithubClient_1.GithubClient(owner, repo);
|
|
231
|
+
const info = await github.getInfo();
|
|
232
|
+
const config = await github.getFile(info.default_branch, "config.json");
|
|
233
|
+
console.log(config);
|
|
234
|
+
await github.download(info.default_branch, this.appConfigService.fs.path(`presets/${name}`));
|
|
235
|
+
this.appConfigService.registerPreset(name, core_1.PRESET_SOURCE_GITHUB);
|
|
347
236
|
}
|
|
348
|
-
return presets;
|
|
349
|
-
}
|
|
350
|
-
async searchOne(options = {}) {
|
|
351
|
-
const [preset] = await this.search(options);
|
|
352
|
-
return preset || null;
|
|
353
237
|
}
|
|
354
238
|
};
|
|
355
239
|
exports.PresetService = PresetService;
|
|
356
240
|
exports.PresetService = PresetService = __decorate([
|
|
357
241
|
(0, core_1.Injectable)(),
|
|
358
242
|
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService,
|
|
243
|
+
PresetRepository_1.PresetRepository,
|
|
359
244
|
LogService_1.LogService])
|
|
360
245
|
], PresetService);
|
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
import { Project, ProjectProperties } from "@wocker/core";
|
|
2
|
+
import { DockerService } from "../modules/docker";
|
|
3
|
+
import { KeystoreService } from "../modules/keystore";
|
|
2
4
|
import { AppConfigService } from "./AppConfigService";
|
|
3
5
|
import { AppEventsService } from "./AppEventsService";
|
|
4
|
-
import { DockerService } from "./DockerService";
|
|
5
6
|
type SearchParams = Partial<{
|
|
6
7
|
name: string;
|
|
7
8
|
path: string;
|
|
8
9
|
}>;
|
|
9
|
-
declare class ProjectService {
|
|
10
|
+
export declare class ProjectService {
|
|
10
11
|
protected readonly appConfigService: AppConfigService;
|
|
11
12
|
protected readonly appEventsService: AppEventsService;
|
|
13
|
+
protected readonly keystoreService: KeystoreService;
|
|
12
14
|
protected readonly dockerService: DockerService;
|
|
13
|
-
constructor(appConfigService: AppConfigService, appEventsService: AppEventsService, dockerService: DockerService);
|
|
15
|
+
constructor(appConfigService: AppConfigService, appEventsService: AppEventsService, keystoreService: KeystoreService, dockerService: DockerService);
|
|
14
16
|
fromObject(data: Partial<ProjectProperties>): Project;
|
|
15
17
|
get(name?: string): Project;
|
|
16
18
|
getById(id: string): Project;
|
|
17
19
|
cdProject(name: string): void;
|
|
18
20
|
start(project: Project, restart?: boolean, rebuild?: boolean): Promise<void>;
|
|
19
21
|
stop(project: Project): Promise<void>;
|
|
20
|
-
save(project: Project):
|
|
22
|
+
save(project: Project): void;
|
|
21
23
|
search(params?: Partial<SearchParams>): Project[];
|
|
22
24
|
searchOne(params?: Partial<SearchParams>): Project | null;
|
|
25
|
+
logs(detach?: boolean): Promise<void>;
|
|
23
26
|
}
|
|
24
|
-
export {
|
|
27
|
+
export {};
|
|
@@ -11,13 +11,15 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.ProjectService = void 0;
|
|
13
13
|
const core_1 = require("@wocker/core");
|
|
14
|
+
const docker_1 = require("../modules/docker");
|
|
15
|
+
const keystore_1 = require("../modules/keystore");
|
|
14
16
|
const AppConfigService_1 = require("./AppConfigService");
|
|
15
17
|
const AppEventsService_1 = require("./AppEventsService");
|
|
16
|
-
const DockerService_1 = require("./DockerService");
|
|
17
18
|
let ProjectService = class ProjectService {
|
|
18
|
-
constructor(appConfigService, appEventsService, dockerService) {
|
|
19
|
+
constructor(appConfigService, appEventsService, keystoreService, dockerService) {
|
|
19
20
|
this.appConfigService = appConfigService;
|
|
20
21
|
this.appEventsService = appEventsService;
|
|
22
|
+
this.keystoreService = keystoreService;
|
|
21
23
|
this.dockerService = dockerService;
|
|
22
24
|
}
|
|
23
25
|
fromObject(data) {
|
|
@@ -26,8 +28,14 @@ let ProjectService = class ProjectService {
|
|
|
26
28
|
constructor(data) {
|
|
27
29
|
super(data);
|
|
28
30
|
}
|
|
29
|
-
async
|
|
30
|
-
|
|
31
|
+
async getSecret(key, defaultValue) {
|
|
32
|
+
return _this.keystoreService.get(`p:${this.name}:${key}`, defaultValue);
|
|
33
|
+
}
|
|
34
|
+
async setSecret(key, value) {
|
|
35
|
+
return _this.keystoreService.set(`p:${this.name}:${key}`, value);
|
|
36
|
+
}
|
|
37
|
+
save() {
|
|
38
|
+
_this.save(this);
|
|
31
39
|
}
|
|
32
40
|
}(data);
|
|
33
41
|
}
|
|
@@ -46,12 +54,11 @@ let ProjectService = class ProjectService {
|
|
|
46
54
|
return project;
|
|
47
55
|
}
|
|
48
56
|
getById(id) {
|
|
49
|
-
const
|
|
50
|
-
const projectData = config.getProject(id);
|
|
57
|
+
const projectData = this.appConfigService.config.getProject(id);
|
|
51
58
|
const data = this.appConfigService.fs.readJSON("projects", id, "config.json");
|
|
52
59
|
return this.fromObject({
|
|
53
60
|
...data,
|
|
54
|
-
path: projectData.path
|
|
61
|
+
path: projectData.path
|
|
55
62
|
});
|
|
56
63
|
}
|
|
57
64
|
cdProject(name) {
|
|
@@ -128,7 +135,7 @@ let ProjectService = class ProjectService {
|
|
|
128
135
|
await this.appEventsService.emit("project:stop", project);
|
|
129
136
|
await this.dockerService.removeContainer(project.containerName);
|
|
130
137
|
}
|
|
131
|
-
|
|
138
|
+
save(project) {
|
|
132
139
|
if (!project.name) {
|
|
133
140
|
throw new Error("Project should has a name");
|
|
134
141
|
}
|
|
@@ -138,27 +145,27 @@ let ProjectService = class ProjectService {
|
|
|
138
145
|
if (!project.id) {
|
|
139
146
|
project.id = project.name;
|
|
140
147
|
}
|
|
141
|
-
const config = this.appConfigService.getConfig();
|
|
142
148
|
if (!this.appConfigService.fs.exists(`projects/${project.id}`)) {
|
|
143
|
-
this.appConfigService.fs.mkdir(`projects/${project.id}`, {
|
|
149
|
+
this.appConfigService.fs.mkdir(`projects/${project.id}`, {
|
|
150
|
+
recursive: true
|
|
151
|
+
});
|
|
144
152
|
}
|
|
145
153
|
const { path, ...rest } = project.toJSON();
|
|
146
|
-
|
|
154
|
+
this.appConfigService.addProject(project.id, project.name, path);
|
|
147
155
|
this.appConfigService.fs.writeJSON(`projects/${project.id}/config.json`, rest);
|
|
148
|
-
|
|
156
|
+
this.appConfigService.save();
|
|
149
157
|
}
|
|
150
158
|
search(params = {}) {
|
|
151
159
|
const { name, path } = params;
|
|
152
|
-
const config = this.appConfigService.getConfig();
|
|
153
160
|
const projects = [];
|
|
154
|
-
for (const
|
|
155
|
-
if (name &&
|
|
161
|
+
for (const projectRef of this.appConfigService.projects || []) {
|
|
162
|
+
if (name && projectRef.name !== name) {
|
|
156
163
|
continue;
|
|
157
164
|
}
|
|
158
|
-
if (path &&
|
|
165
|
+
if (path && projectRef.path !== path) {
|
|
159
166
|
continue;
|
|
160
167
|
}
|
|
161
|
-
const project = this.getById(
|
|
168
|
+
const project = this.getById(projectRef.name);
|
|
162
169
|
if (name && project.name !== name) {
|
|
163
170
|
continue;
|
|
164
171
|
}
|
|
@@ -170,11 +177,30 @@ let ProjectService = class ProjectService {
|
|
|
170
177
|
const [project] = this.search(params);
|
|
171
178
|
return project || null;
|
|
172
179
|
}
|
|
180
|
+
async logs(detach) {
|
|
181
|
+
const project = this.get();
|
|
182
|
+
const container = await this.dockerService.getContainer(project.containerName);
|
|
183
|
+
if (!container) {
|
|
184
|
+
throw new Error("Project not started");
|
|
185
|
+
}
|
|
186
|
+
if (!detach) {
|
|
187
|
+
await this.dockerService.logs(container);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const data = await container.logs({
|
|
191
|
+
stdout: true,
|
|
192
|
+
stderr: true,
|
|
193
|
+
follow: false
|
|
194
|
+
});
|
|
195
|
+
process.stdout.write(data);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
173
198
|
};
|
|
174
199
|
exports.ProjectService = ProjectService;
|
|
175
200
|
exports.ProjectService = ProjectService = __decorate([
|
|
176
201
|
(0, core_1.Injectable)("PROJECT_SERVICE"),
|
|
177
202
|
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService,
|
|
178
203
|
AppEventsService_1.AppEventsService,
|
|
179
|
-
|
|
204
|
+
keystore_1.KeystoreService,
|
|
205
|
+
docker_1.DockerService])
|
|
180
206
|
], ProjectService);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const followProgress2: (stream: NodeJS.ReadableStream) => Promise<void>;
|