@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.
Files changed (127) hide show
  1. package/README.md +8 -0
  2. package/lib/AppModule.js +46 -75
  3. package/lib/controllers/DebugController.d.ts +4 -2
  4. package/lib/controllers/DebugController.js +19 -11
  5. package/lib/controllers/ExperimentalController.d.ts +8 -0
  6. package/lib/controllers/ExperimentalController.js +77 -0
  7. package/lib/controllers/PluginController.d.ts +4 -5
  8. package/lib/controllers/PluginController.js +14 -59
  9. package/lib/controllers/PresetController.d.ts +9 -3
  10. package/lib/controllers/PresetController.js +61 -52
  11. package/lib/controllers/ProjectController.d.ts +7 -2
  12. package/lib/controllers/ProjectController.js +124 -94
  13. package/lib/controllers/index.d.ts +1 -3
  14. package/lib/controllers/index.js +1 -3
  15. package/lib/env.d.ts +2 -2
  16. package/lib/env.js +3 -3
  17. package/lib/main.js +16 -7
  18. package/lib/makes/GithubClient.d.ts +14 -0
  19. package/lib/makes/GithubClient.js +65 -0
  20. package/lib/makes/Logger.d.ts +1 -1
  21. package/lib/makes/Plugin.d.ts +5 -0
  22. package/lib/makes/Plugin.js +15 -0
  23. package/lib/makes/index.d.ts +1 -1
  24. package/lib/makes/index.js +1 -1
  25. package/lib/modules/app/index.d.ts +2 -0
  26. package/lib/{plugins/proxmox → modules/app}/index.js +6 -13
  27. package/lib/modules/docker/index.d.ts +8 -0
  28. package/lib/modules/docker/index.js +41 -0
  29. package/lib/modules/docker/services/ContainerService.d.ts +14 -0
  30. package/lib/modules/docker/services/ContainerService.js +115 -0
  31. package/lib/{services → modules/docker/services}/DockerService.d.ts +12 -5
  32. package/lib/{services → modules/docker/services}/DockerService.js +33 -117
  33. package/lib/modules/docker/services/ImageService.d.ts +18 -0
  34. package/lib/modules/docker/services/ImageService.js +68 -0
  35. package/lib/modules/docker/services/ModemService.d.ts +14 -0
  36. package/lib/modules/docker/services/ModemService.js +137 -0
  37. package/lib/modules/docker/services/ProtoService.d.ts +6 -0
  38. package/lib/modules/docker/services/ProtoService.js +20 -0
  39. package/lib/modules/index.d.ts +3 -0
  40. package/lib/{plugins → modules}/index.js +3 -3
  41. package/lib/modules/keystore/controllers/KeystoreController.d.ts +11 -0
  42. package/lib/modules/keystore/controllers/KeystoreController.js +106 -0
  43. package/lib/modules/keystore/index.d.ts +4 -0
  44. package/lib/{plugins/elastic-search → modules/keystore}/index.js +16 -9
  45. package/lib/modules/keystore/providers/FileKeystoreProvider.d.ts +16 -0
  46. package/lib/modules/keystore/providers/FileKeystoreProvider.js +97 -0
  47. package/lib/modules/keystore/providers/KeytarKeystoreProvider.d.ts +9 -0
  48. package/lib/modules/keystore/providers/KeytarKeystoreProvider.js +74 -0
  49. package/lib/modules/keystore/services/KeystoreService.d.ts +12 -0
  50. package/lib/modules/keystore/services/KeystoreService.js +70 -0
  51. package/lib/modules/keystore/types/FileKeystore.d.ts +17 -0
  52. package/lib/modules/keystore/types/FileKeystore.js +33 -0
  53. package/lib/modules/keystore/types/Keytar.d.ts +8 -0
  54. package/lib/modules/keystore/types/Keytar.js +2 -0
  55. package/lib/modules/keystore/utils/createEncryptionKey.d.ts +1 -0
  56. package/lib/modules/keystore/utils/createEncryptionKey.js +46 -0
  57. package/lib/modules/keystore/utils/createPasswordHash.d.ts +1 -0
  58. package/lib/modules/keystore/utils/createPasswordHash.js +20 -0
  59. package/lib/modules/keystore/utils/decrypt.d.ts +1 -0
  60. package/lib/modules/keystore/utils/decrypt.js +15 -0
  61. package/lib/modules/keystore/utils/encrypt.d.ts +1 -0
  62. package/lib/modules/keystore/utils/encrypt.js +19 -0
  63. package/lib/modules/keystore/utils/index.d.ts +5 -0
  64. package/lib/{services → modules/keystore/utils}/index.js +5 -10
  65. package/lib/modules/keystore/utils/verifyPasswordHash.d.ts +1 -0
  66. package/lib/modules/keystore/utils/verifyPasswordHash.js +9 -0
  67. package/lib/{controllers → modules/proxy/controllers}/CertController.d.ts +2 -1
  68. package/lib/{controllers → modules/proxy/controllers}/CertController.js +4 -3
  69. package/lib/{controllers → modules/proxy/controllers}/ProxyController.d.ts +4 -1
  70. package/lib/{controllers → modules/proxy/controllers}/ProxyController.js +46 -37
  71. package/lib/modules/proxy/index.d.ts +5 -0
  72. package/lib/modules/proxy/index.js +39 -0
  73. package/lib/{services → modules/proxy/services}/CertService.d.ts +3 -3
  74. package/lib/{services → modules/proxy/services}/CertService.js +11 -11
  75. package/lib/{services → modules/proxy/services}/ProxyService.d.ts +2 -2
  76. package/lib/{services → modules/proxy/services}/ProxyService.js +21 -13
  77. package/lib/repositories/PresetRepository.d.ts +23 -0
  78. package/lib/repositories/PresetRepository.js +115 -0
  79. package/lib/repositories/index.d.ts +1 -0
  80. package/lib/repositories/index.js +17 -0
  81. package/lib/services/AppConfigService.d.ts +6 -2
  82. package/lib/services/AppConfigService.js +60 -53
  83. package/lib/services/AppEventsService.d.ts +4 -4
  84. package/lib/services/AppEventsService.js +14 -10
  85. package/lib/services/LogService.d.ts +3 -1
  86. package/lib/services/LogService.js +12 -10
  87. package/lib/services/PluginService.d.ts +8 -2
  88. package/lib/services/PluginService.js +69 -16
  89. package/lib/services/PresetService.d.ts +9 -8
  90. package/lib/services/PresetService.js +145 -260
  91. package/lib/services/ProjectService.d.ts +8 -5
  92. package/lib/services/ProjectService.js +44 -18
  93. package/lib/utils/followProgress2.d.ts +1 -0
  94. package/lib/utils/followProgress2.js +63 -0
  95. package/lib/utils/index.d.ts +1 -4
  96. package/lib/utils/index.js +1 -4
  97. package/package.json +24 -15
  98. package/proto/buildkit.proto +55 -0
  99. package/proto/solver/pb/ops.proto +443 -0
  100. package/lib/controllers/ImageController.d.ts +0 -7
  101. package/lib/controllers/ImageController.js +0 -46
  102. package/lib/makes/FS.d.ts +0 -27
  103. package/lib/makes/FS.js +0 -284
  104. package/lib/makes/LineConvertStream.d.ts +0 -11
  105. package/lib/makes/LineConvertStream.js +0 -42
  106. package/lib/makes/Model.d.ts +0 -5
  107. package/lib/makes/Model.js +0 -12
  108. package/lib/plugins/MongodbPlugin.d.ts +0 -20
  109. package/lib/plugins/MongodbPlugin.js +0 -288
  110. package/lib/plugins/elastic-search/controllers/ElasticSearchController.d.ts +0 -10
  111. package/lib/plugins/elastic-search/controllers/ElasticSearchController.js +0 -91
  112. package/lib/plugins/elastic-search/index.d.ts +0 -2
  113. package/lib/plugins/index.d.ts +0 -3
  114. package/lib/plugins/proxmox/controllers/ProxmoxController.d.ts +0 -14
  115. package/lib/plugins/proxmox/controllers/ProxmoxController.js +0 -127
  116. package/lib/plugins/proxmox/index.d.ts +0 -2
  117. package/lib/services/index.d.ts +0 -10
  118. package/lib/utils/followProgress.d.ts +0 -1
  119. package/lib/utils/followProgress.js +0 -73
  120. package/lib/utils/volumeFormat.d.ts +0 -6
  121. package/lib/utils/volumeFormat.js +0 -8
  122. package/lib/utils/volumeParse.d.ts +0 -2
  123. package/lib/utils/volumeParse.js +0 -13
  124. package/presets/bun/Dockerfile +0 -11
  125. package/presets/bun/config.json +0 -4
  126. /package/lib/{utils/format-size-units.d.ts → modules/docker/utils/formatSizeUnits.d.ts} +0 -0
  127. /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 env_1 = require("../env");
58
- const makes_1 = require("../makes");
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
- toObject(config) {
65
- const _this = this;
66
- return new class extends core_1.Preset {
67
- constructor(data) {
68
- super(data);
69
- }
70
- async save() {
71
- const { source, path, ...rest } = this.toJSON();
72
- const config = _this.appConfigService.getConfig();
73
- let presetData = (config.presets || []).find((presetData) => {
74
- return presetData.name === this.name;
75
- });
76
- switch (this.source) {
77
- case core_1.PRESET_SOURCE_EXTERNAL:
78
- const fs = new core_1.FileSystem(this.path);
79
- fs.writeJSON("config.json", rest);
80
- break;
81
- case core_1.PRESET_SOURCE_GITHUB: {
82
- const fs = new core_1.FileSystem(_this.appConfigService.dataPath("presets", this.name));
83
- if (!fs.exists()) {
84
- 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
+ }
85
64
  }
86
- fs.writeJSON("config.json", rest);
87
- break;
88
65
  }
66
+ break;
89
67
  }
90
- if (!presetData) {
91
- config.registerPreset(this.name, source, path);
92
- 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;
93
77
  }
94
- }
95
- async delete() {
96
- if (this.source === core_1.PRESET_SOURCE_GITHUB) {
97
- const config = _this.appConfigService.getConfig();
98
- await makes_1.FS.rm(_this.appConfigService.dataPath("presets", this.name), {
99
- 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
100
85
  });
101
- config.unregisterPreset(this.name);
102
- await config.save();
86
+ break;
103
87
  }
104
88
  }
105
- }(config);
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
- let preset = await this.searchOne({
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
- const fs = new core_1.FileSystem(this.appConfigService.pwd());
160
- if (!preset) {
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 (!preset.name) {
176
- const list = await this.getList();
177
- preset.name = await (0, utils_1.promptText)({
178
- message: "Preset name:",
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
- if (!preset.version) {
196
- preset.version = await (0, utils_1.promptText)({
197
- message: "Preset version:",
198
- validate: (version) => {
199
- if (!/^[0-9]+\.[0.9]+\.[0-9]+$/.test(version)) {
200
- return "Invalid version";
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
- default: preset.version
205
- });
206
- }
207
- if (!preset.type) {
208
- preset.type = await (0, utils_1.promptSelect)({
209
- message: "Preset type:",
210
- options: ["dockerfile", "image"]
211
- });
212
- }
213
- 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) {
214
161
  case "dockerfile":
215
- if (!preset.dockerfile) {
216
- const files = await fs.readdirFiles();
217
- const dockerfiles = files.filter((fileName) => {
218
- if (new RegExp("^(.*)\\.dockerfile$").test(fileName)) {
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
- preset.dockerfile = await (0, utils_1.promptSelect)({
227
- message: "Preset dockerfile:",
228
- options: dockerfiles
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
- if (preset.image) {
234
- preset.image = await (0, utils_1.promptText)({
235
- message: "Preset image:",
236
- required: true,
237
- validate(value) {
238
- if (!/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?::[a-z0-9]+(?:[._-][a-z0-9]+)*)?$/.test(value)) {
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(preset.toJSON(), null, 4));
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
- await preset.save();
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 = await this.searchOne({
202
+ const preset = this.presetRepository.searchOne({
257
203
  path: this.appConfigService.pwd()
258
204
  });
259
205
  if (!preset) {
260
206
  return;
261
207
  }
262
- const config = this.appConfigService.getConfig();
263
- config.unregisterPreset(preset.name);
264
- await config.save();
208
+ this.appConfigService.config.unregisterPreset(preset.name);
209
+ this.appConfigService.save();
265
210
  }
266
- async get(name) {
267
- const list = await this.getList();
268
- const item = list.find((item) => {
269
- return item.name === name;
270
- });
271
- if (!item) {
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
- const config = await makes_1.FS.readJSON(item.path, "config.json");
275
- return this.toObject({
276
- ...item,
277
- ...config
278
- });
218
+ return preset;
279
219
  }
280
- async addPreset(name, version) {
281
- let preset = await this.searchOne({
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
- const res = await makes_1.Http.get("https://raw.githubusercontent.com")
287
- .withHeader("User-Agent", "Wocker")
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): 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
- export { ProjectService };
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 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
  }
@@ -46,12 +54,11 @@ let ProjectService = class ProjectService {
46
54
  return project;
47
55
  }
48
56
  getById(id) {
49
- const config = this.appConfigService.getConfig();
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 || projectData.src
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
- async save(project) {
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}`, { recursive: true });
149
+ this.appConfigService.fs.mkdir(`projects/${project.id}`, {
150
+ recursive: true
151
+ });
144
152
  }
145
153
  const { path, ...rest } = project.toJSON();
146
- config.addProject(project.id, project.name, path);
154
+ this.appConfigService.addProject(project.id, project.name, path);
147
155
  this.appConfigService.fs.writeJSON(`projects/${project.id}/config.json`, rest);
148
- await config.save();
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 projectConfig of config.projects || []) {
155
- if (name && projectConfig.name !== name) {
161
+ for (const projectRef of this.appConfigService.projects || []) {
162
+ if (name && projectRef.name !== name) {
156
163
  continue;
157
164
  }
158
- if (path && (projectConfig.path || projectConfig.src) !== path) {
165
+ if (path && projectRef.path !== path) {
159
166
  continue;
160
167
  }
161
- const project = this.getById(projectConfig.id);
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
- DockerService_1.DockerService])
204
+ keystore_1.KeystoreService,
205
+ docker_1.DockerService])
180
206
  ], ProjectService);
@@ -0,0 +1 @@
1
+ export declare const followProgress2: (stream: NodeJS.ReadableStream) => Promise<void>;