@wocker/ws 1.0.20 → 1.0.22

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