@wocker/ws 1.0.23 → 1.0.24

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 (83) hide show
  1. package/lib/{AppModule.d.ts → RootModule.d.ts} +1 -1
  2. package/lib/{AppModule.js → RootModule.js} +32 -30
  3. package/lib/controllers/DebugController.d.ts +1 -2
  4. package/lib/controllers/DebugController.js +4 -6
  5. package/lib/controllers/ExperimentalController.d.ts +1 -1
  6. package/lib/controllers/ExperimentalController.js +1 -2
  7. package/lib/controllers/PluginController.d.ts +1 -1
  8. package/lib/controllers/PluginController.js +1 -2
  9. package/lib/controllers/ProjectController.d.ts +7 -10
  10. package/lib/controllers/ProjectController.js +64 -202
  11. package/lib/controllers/index.d.ts +0 -1
  12. package/lib/controllers/index.js +0 -1
  13. package/lib/env.d.ts +2 -2
  14. package/lib/env.js +3 -3
  15. package/lib/main.js +5 -9
  16. package/lib/makes/index.d.ts +0 -1
  17. package/lib/makes/index.js +0 -1
  18. package/lib/modules/app/index.js +17 -1
  19. package/lib/modules/docker/index.d.ts +2 -2
  20. package/lib/modules/docker/index.js +5 -5
  21. package/lib/modules/docker/services/DockerService.d.ts +2 -2
  22. package/lib/modules/docker/services/DockerService.js +5 -5
  23. package/lib/modules/docker/services/ModemService.d.ts +1 -0
  24. package/lib/modules/docker/services/ModemService.js +1 -0
  25. package/lib/modules/index.d.ts +3 -0
  26. package/lib/modules/index.js +3 -0
  27. package/lib/modules/keystore/controllers/KeystoreController.d.ts +1 -1
  28. package/lib/modules/keystore/controllers/KeystoreController.js +1 -2
  29. package/lib/modules/keystore/providers/FileKeystoreProvider.d.ts +3 -4
  30. package/lib/modules/keystore/providers/FileKeystoreProvider.js +4 -5
  31. package/lib/modules/keystore/services/KeystoreService.d.ts +4 -3
  32. package/lib/modules/keystore/services/KeystoreService.js +9 -6
  33. package/lib/modules/preset/controllers/PresetController.d.ts +18 -0
  34. package/lib/modules/preset/controllers/PresetController.js +157 -0
  35. package/lib/modules/preset/controllers/PresetListener.d.ts +14 -0
  36. package/lib/modules/preset/controllers/PresetListener.js +140 -0
  37. package/lib/modules/preset/index.d.ts +5 -0
  38. package/lib/modules/preset/index.js +39 -0
  39. package/lib/modules/preset/repositories/PresetRepository.d.ts +16 -0
  40. package/lib/{repositories → modules/preset/repositories}/PresetRepository.js +9 -11
  41. package/lib/{services → modules/preset/services}/PresetService.d.ts +4 -12
  42. package/lib/{services → modules/preset/services}/PresetService.js +20 -24
  43. package/lib/modules/project/controllers/ProjectController.d.ts +13 -0
  44. package/lib/modules/project/controllers/ProjectController.js +127 -0
  45. package/lib/modules/project/index.d.ts +5 -0
  46. package/lib/modules/project/index.js +39 -0
  47. package/lib/modules/project/repositories/ProjectRepository.d.ts +13 -0
  48. package/lib/modules/project/repositories/ProjectRepository.js +90 -0
  49. package/lib/modules/project/services/ProjectService.d.ts +21 -0
  50. package/lib/modules/project/services/ProjectService.js +211 -0
  51. package/lib/modules/proxy/controllers/CertController.d.ts +1 -1
  52. package/lib/modules/proxy/controllers/CertController.js +2 -2
  53. package/lib/modules/proxy/controllers/ProxyController.d.ts +4 -6
  54. package/lib/modules/proxy/controllers/ProxyController.js +9 -11
  55. package/lib/modules/proxy/index.js +3 -1
  56. package/lib/modules/proxy/services/CertService.d.ts +3 -4
  57. package/lib/modules/proxy/services/CertService.js +5 -6
  58. package/lib/modules/proxy/services/ProxyService.d.ts +3 -3
  59. package/lib/modules/proxy/services/ProxyService.js +14 -15
  60. package/lib/services/PluginService.d.ts +1 -3
  61. package/lib/services/PluginService.js +9 -13
  62. package/package.json +5 -5
  63. package/lib/controllers/PresetController.d.ts +0 -27
  64. package/lib/controllers/PresetController.js +0 -364
  65. package/lib/makes/Logger.d.ts +0 -9
  66. package/lib/makes/Logger.js +0 -34
  67. package/lib/repositories/PresetRepository.d.ts +0 -23
  68. package/lib/repositories/index.d.ts +0 -1
  69. package/lib/repositories/index.js +0 -17
  70. package/lib/services/AppConfigService.d.ts +0 -24
  71. package/lib/services/AppConfigService.js +0 -154
  72. package/lib/services/AppEventsService.d.ts +0 -9
  73. package/lib/services/AppEventsService.js +0 -43
  74. package/lib/services/LogService.d.ts +0 -15
  75. package/lib/services/LogService.js +0 -67
  76. package/lib/services/ProjectService.d.ts +0 -27
  77. package/lib/services/ProjectService.js +0 -206
  78. package/presets/go/Dockerfile +0 -19
  79. package/presets/go/config.json +0 -14
  80. package/presets/php-fpm/Dockerfile +0 -173
  81. package/presets/php-fpm/bin/compare-version +0 -3
  82. package/presets/php-fpm/config.json +0 -55
  83. package/presets/php-fpm/etc/nginx/sites-available/default.conf +0 -36
@@ -1,25 +1,17 @@
1
- import { EnvConfig, Project, Preset, PresetVariableConfig } from "@wocker/core";
2
- import { AppConfigService } from "./AppConfigService";
3
- import { LogService } from "./LogService";
1
+ import { Project, Preset, PresetVariableConfig, EnvConfig, AppConfigService, AppFileSystemService } from "@wocker/core";
4
2
  import { PresetRepository } from "../repositories/PresetRepository";
5
- type SearchOptions = Partial<{
6
- name: string;
7
- source: string;
8
- path: string;
9
- }>;
10
3
  export declare class PresetService {
11
4
  protected readonly appConfigService: AppConfigService;
5
+ protected readonly fs: AppFileSystemService;
12
6
  protected readonly presetRepository: PresetRepository;
13
- protected readonly logService: LogService;
14
- constructor(appConfigService: AppConfigService, presetRepository: PresetRepository, logService: LogService);
7
+ constructor(appConfigService: AppConfigService, fs: AppFileSystemService, presetRepository: PresetRepository);
15
8
  prompt(configMap: {
16
9
  [name: string]: PresetVariableConfig;
17
10
  }, values?: EnvConfig): Promise<EnvConfig>;
18
11
  getImageNameForProject(project: Project, preset: Preset): string;
19
12
  getImageName(preset: Preset, buildArgs: EnvConfig): string;
13
+ get(name?: string): Preset;
20
14
  init(): Promise<void>;
21
15
  deinit(): Promise<void>;
22
- get(name?: string): Preset;
23
16
  addPreset(name: string, repository?: string, version?: string): Promise<void>;
24
17
  }
25
- export { SearchOptions as PresetServiceSearchOptions };
@@ -16,15 +16,13 @@ exports.PresetService = void 0;
16
16
  const core_1 = require("@wocker/core");
17
17
  const utils_1 = require("@wocker/utils");
18
18
  const md5_1 = __importDefault(require("md5"));
19
- const AppConfigService_1 = require("./AppConfigService");
20
- const LogService_1 = require("./LogService");
21
19
  const PresetRepository_1 = require("../repositories/PresetRepository");
22
- const GithubClient_1 = require("../makes/GithubClient");
20
+ const GithubClient_1 = require("../../../makes/GithubClient");
23
21
  let PresetService = class PresetService {
24
- constructor(appConfigService, presetRepository, logService) {
22
+ constructor(appConfigService, fs, presetRepository) {
25
23
  this.appConfigService = appConfigService;
24
+ this.fs = fs;
26
25
  this.presetRepository = presetRepository;
27
- this.logService = logService;
28
26
  }
29
27
  async prompt(configMap, values = {}) {
30
28
  for (const name in configMap) {
@@ -36,7 +34,7 @@ let PresetService = class PresetService {
36
34
  required: config.required,
37
35
  default: typeof values[name] !== "undefined" && values[name] === "true"
38
36
  ? true
39
- : undefined,
37
+ : config.default
40
38
  });
41
39
  values[name] = value.toString();
42
40
  break;
@@ -117,6 +115,15 @@ let PresetService = class PresetService {
117
115
  }).join("-");
118
116
  return `ws-preset-${preset.name}:${version}`;
119
117
  }
118
+ get(name) {
119
+ const preset = name
120
+ ? this.presetRepository.searchOne({ name })
121
+ : this.presetRepository.searchOne({ path: this.appConfigService.pwd() });
122
+ if (!preset) {
123
+ throw new Error(name ? `Preset "${name}" not found` : "Preset not found");
124
+ }
125
+ return preset;
126
+ }
120
127
  async init() {
121
128
  const fs = new core_1.FileSystem(this.appConfigService.pwd());
122
129
  let preset = this.presetRepository.searchOne({
@@ -208,30 +215,19 @@ let PresetService = class PresetService {
208
215
  this.appConfigService.config.unregisterPreset(preset.name);
209
216
  this.appConfigService.save();
210
217
  }
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");
217
- }
218
- return preset;
219
- }
220
218
  async addPreset(name, repository, version) {
219
+ if (!repository) {
220
+ repository = `kearisp/wocker-${name}-preset`;
221
+ }
221
222
  let preset = this.presetRepository.searchOne({
222
223
  name
223
224
  });
224
225
  if (!preset) {
225
226
  console.info("Loading...");
226
- if (!repository) {
227
- repository = `kearisp/wocker-${name}-preset`;
228
- }
229
227
  const [owner, repo] = repository.split("/");
230
228
  const github = new GithubClient_1.GithubClient(owner, repo);
231
229
  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}`));
230
+ await github.download(info.default_branch, this.fs.path(`presets/${name}`));
235
231
  this.appConfigService.registerPreset(name, core_1.PRESET_SOURCE_GITHUB);
236
232
  }
237
233
  }
@@ -239,7 +235,7 @@ let PresetService = class PresetService {
239
235
  exports.PresetService = PresetService;
240
236
  exports.PresetService = PresetService = __decorate([
241
237
  (0, core_1.Injectable)(),
242
- __metadata("design:paramtypes", [AppConfigService_1.AppConfigService,
243
- PresetRepository_1.PresetRepository,
244
- LogService_1.LogService])
238
+ __metadata("design:paramtypes", [core_1.AppConfigService,
239
+ core_1.AppFileSystemService,
240
+ PresetRepository_1.PresetRepository])
245
241
  ], PresetService);
@@ -0,0 +1,13 @@
1
+ import { AppConfigService, ProcessService } from "@wocker/core";
2
+ import { PresetService } from "../../preset";
3
+ import { ProjectService } from "../services/ProjectService";
4
+ export declare class ProjectController {
5
+ protected readonly appConfigService: AppConfigService;
6
+ protected readonly processService: ProcessService;
7
+ protected readonly projectService: ProjectService;
8
+ protected readonly presetService: PresetService;
9
+ constructor(appConfigService: AppConfigService, processService: ProcessService, projectService: ProjectService, presetService: PresetService);
10
+ start(name?: string, restart?: boolean, build?: boolean, attach?: boolean): Promise<void>;
11
+ stop(name?: string): Promise<void>;
12
+ eject(name?: string): Promise<void>;
13
+ }
@@ -0,0 +1,127 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ProjectController = void 0;
19
+ const core_1 = require("@wocker/core");
20
+ const utils_1 = require("@wocker/utils");
21
+ const path_1 = __importDefault(require("path"));
22
+ const preset_1 = require("../../preset");
23
+ const ProjectService_1 = require("../services/ProjectService");
24
+ let ProjectController = class ProjectController {
25
+ constructor(appConfigService, processService, projectService, presetService) {
26
+ this.appConfigService = appConfigService;
27
+ this.processService = processService;
28
+ this.projectService = projectService;
29
+ this.presetService = presetService;
30
+ }
31
+ async start(name, restart, build, attach) {
32
+ const project = this.projectService.get(name);
33
+ await this.projectService.start(project, restart, build, attach);
34
+ }
35
+ async stop(name) {
36
+ const project = this.projectService.get(name);
37
+ await this.projectService.stop(project);
38
+ }
39
+ async eject(name) {
40
+ const project = this.projectService.get(name);
41
+ const preset = this.presetService.get(project.preset);
42
+ if (!preset) {
43
+ throw new Error("Preset not found");
44
+ }
45
+ const confirm = await (0, utils_1.promptConfirm)({
46
+ message: "Confirm eject",
47
+ default: false
48
+ });
49
+ if (!confirm) {
50
+ return;
51
+ }
52
+ const copier = new core_1.FileSystemManager(preset.path, this.processService.pwd());
53
+ if (preset.dockerfile) {
54
+ if (!copier.destination.exists(preset.dockerfile)) {
55
+ copier.copy(preset.dockerfile);
56
+ }
57
+ project.type = "dockerfile";
58
+ project.dockerfile = preset.dockerfile;
59
+ }
60
+ const files = copier.source.readdir("", {
61
+ recursive: true
62
+ });
63
+ for (const path of files) {
64
+ const stat = copier.source.stat(path), dir = path_1.default.dirname(path);
65
+ if (stat.isFile() && path === "config.json") {
66
+ continue;
67
+ }
68
+ if (stat.isFile() && path === preset.dockerfile) {
69
+ continue;
70
+ }
71
+ if (copier.destination.exists(path)) {
72
+ continue;
73
+ }
74
+ if (!copier.destination.exists(dir)) {
75
+ copier.destination.mkdir(dir, {
76
+ recursive: true
77
+ });
78
+ }
79
+ copier.copy(path);
80
+ }
81
+ delete project.preset;
82
+ delete project.imageName;
83
+ project.save();
84
+ }
85
+ };
86
+ exports.ProjectController = ProjectController;
87
+ __decorate([
88
+ (0, core_1.Command)("start"),
89
+ (0, core_1.Description)("Starting project"),
90
+ __param(0, (0, core_1.Option)("name", "n")),
91
+ __param(0, (0, core_1.Description)("The name of the project")),
92
+ __param(1, (0, core_1.Option)("restart", "r")),
93
+ __param(1, (0, core_1.Description)("Restarting project")),
94
+ __param(2, (0, core_1.Option)("build", "b")),
95
+ __param(2, (0, core_1.Description)("Build")),
96
+ __param(3, (0, core_1.Option)("attach", "a")),
97
+ __param(3, (0, core_1.Description)("Attach")),
98
+ __metadata("design:type", Function),
99
+ __metadata("design:paramtypes", [String, Boolean, Boolean, Boolean]),
100
+ __metadata("design:returntype", Promise)
101
+ ], ProjectController.prototype, "start", null);
102
+ __decorate([
103
+ (0, core_1.Command)("stop"),
104
+ (0, core_1.Description)("Stopping project"),
105
+ __param(0, (0, core_1.Option)("name", "n")),
106
+ __param(0, (0, core_1.Description)("The name of the project")),
107
+ __metadata("design:type", Function),
108
+ __metadata("design:paramtypes", [String]),
109
+ __metadata("design:returntype", Promise)
110
+ ], ProjectController.prototype, "stop", null);
111
+ __decorate([
112
+ (0, core_1.Command)("preset:eject"),
113
+ (0, core_1.Description)("Eject preset files into the project"),
114
+ __param(0, (0, core_1.Option)("name", "n")),
115
+ __param(0, (0, core_1.Description)("The name of the project")),
116
+ __metadata("design:type", Function),
117
+ __metadata("design:paramtypes", [String]),
118
+ __metadata("design:returntype", Promise)
119
+ ], ProjectController.prototype, "eject", null);
120
+ exports.ProjectController = ProjectController = __decorate([
121
+ (0, core_1.Controller)(),
122
+ (0, core_1.Description)("Project commands"),
123
+ __metadata("design:paramtypes", [core_1.AppConfigService,
124
+ core_1.ProcessService,
125
+ ProjectService_1.ProjectService,
126
+ preset_1.PresetService])
127
+ ], ProjectController);
@@ -0,0 +1,5 @@
1
+ import { ProjectRepository } from "./repositories/ProjectRepository";
2
+ import { ProjectService } from "./services/ProjectService";
3
+ export declare class ProjectModule {
4
+ }
5
+ export { ProjectRepository, ProjectService };
@@ -0,0 +1,39 @@
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.ProjectService = exports.ProjectRepository = exports.ProjectModule = void 0;
10
+ const core_1 = require("@wocker/core");
11
+ const keystore_1 = require("../keystore");
12
+ const docker_1 = require("../docker");
13
+ const preset_1 = require("../preset");
14
+ const ProjectController_1 = require("./controllers/ProjectController");
15
+ const ProjectRepository_1 = require("./repositories/ProjectRepository");
16
+ Object.defineProperty(exports, "ProjectRepository", { enumerable: true, get: function () { return ProjectRepository_1.ProjectRepository; } });
17
+ const ProjectService_1 = require("./services/ProjectService");
18
+ Object.defineProperty(exports, "ProjectService", { enumerable: true, get: function () { return ProjectService_1.ProjectService; } });
19
+ let ProjectModule = class ProjectModule {
20
+ };
21
+ exports.ProjectModule = ProjectModule;
22
+ exports.ProjectModule = ProjectModule = __decorate([
23
+ (0, core_1.Module)({
24
+ imports: [
25
+ preset_1.PresetModule,
26
+ keystore_1.KeystoreModule,
27
+ docker_1.DockerModule
28
+ ],
29
+ controllers: [ProjectController_1.ProjectController],
30
+ providers: [
31
+ ProjectRepository_1.ProjectRepository,
32
+ ProjectService_1.ProjectService
33
+ ],
34
+ exports: [
35
+ ProjectRepository_1.ProjectRepository,
36
+ ProjectService_1.ProjectService
37
+ ]
38
+ })
39
+ ], ProjectModule);
@@ -0,0 +1,13 @@
1
+ import { AppConfigService, AppFileSystemService, Project, ProjectProperties, ProjectServiceSearchParams as SearchParams } from "@wocker/core";
2
+ import { KeystoreService } from "../../keystore";
3
+ export declare class ProjectRepository {
4
+ protected readonly appConfigService: AppConfigService;
5
+ protected readonly fs: AppFileSystemService;
6
+ protected readonly keystoreService: KeystoreService;
7
+ constructor(appConfigService: AppConfigService, fs: AppFileSystemService, keystoreService: KeystoreService);
8
+ getByName(name: string): Project;
9
+ fromObject(data: Partial<ProjectProperties>): Project;
10
+ save(project: Project): void;
11
+ search(params?: SearchParams): Project[];
12
+ searchOne(params?: SearchParams): Project | null;
13
+ }
@@ -0,0 +1,90 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProjectRepository = void 0;
13
+ const core_1 = require("@wocker/core");
14
+ const keystore_1 = require("../../keystore");
15
+ let ProjectRepository = class ProjectRepository {
16
+ constructor(appConfigService, fs, keystoreService) {
17
+ this.appConfigService = appConfigService;
18
+ this.fs = fs;
19
+ this.keystoreService = keystoreService;
20
+ }
21
+ getByName(name) {
22
+ const ref = this.appConfigService.config.getProject(name), config = this.fs.readJSON(`projects/${name}/config.json`);
23
+ return this.fromObject({
24
+ ...config,
25
+ path: ref.path
26
+ });
27
+ }
28
+ fromObject(data) {
29
+ const _this = this;
30
+ return new class extends core_1.Project {
31
+ constructor(data) {
32
+ super(data);
33
+ }
34
+ async getSecret(key, defaultValue) {
35
+ return _this.keystoreService.get(`p:${this.name}:${key}`, defaultValue);
36
+ }
37
+ async setSecret(key, value) {
38
+ return _this.keystoreService.set(`p:${this.name}:${key}`, value);
39
+ }
40
+ save() {
41
+ _this.save(this);
42
+ }
43
+ }(data);
44
+ }
45
+ save(project) {
46
+ if (!project.name) {
47
+ throw new Error("Project should has a name");
48
+ }
49
+ if (!project.path) {
50
+ throw new Error("Project should has a path");
51
+ }
52
+ if (!project.id) {
53
+ project.id = project.name;
54
+ }
55
+ if (!this.fs.exists(`projects/${project.id}`)) {
56
+ this.fs.mkdir(`projects/${project.id}`, {
57
+ recursive: true
58
+ });
59
+ }
60
+ const { path, ...rest } = project.toObject();
61
+ this.appConfigService.addProject(project.id, project.name, path);
62
+ this.fs.writeJSON(`projects/${project.id}/config.json`, rest);
63
+ this.appConfigService.save();
64
+ }
65
+ search(params = {}) {
66
+ const { name, path } = params, projects = [];
67
+ for (const ref of this.appConfigService.projects) {
68
+ if (name && ref.name !== name) {
69
+ continue;
70
+ }
71
+ if (path && ref.path !== path) {
72
+ continue;
73
+ }
74
+ const project = this.getByName(ref.name);
75
+ projects.push(project);
76
+ }
77
+ return projects;
78
+ }
79
+ searchOne(params = {}) {
80
+ const [project] = this.search(params);
81
+ return project || null;
82
+ }
83
+ };
84
+ exports.ProjectRepository = ProjectRepository;
85
+ exports.ProjectRepository = ProjectRepository = __decorate([
86
+ (0, core_1.Injectable)(),
87
+ __metadata("design:paramtypes", [core_1.AppConfigService,
88
+ core_1.AppFileSystemService,
89
+ keystore_1.KeystoreService])
90
+ ], ProjectRepository);
@@ -0,0 +1,21 @@
1
+ import { Project, AppConfigService, EventService, ProjectService as CoreProjectService, ProjectServiceSearchParams as SearchParams } from "@wocker/core";
2
+ import { ProjectRepository } from "../repositories/ProjectRepository";
3
+ import { DockerService } from "../../docker";
4
+ import { PresetService, PresetRepository } from "../../preset";
5
+ export declare class ProjectService extends CoreProjectService {
6
+ protected readonly appConfigService: AppConfigService;
7
+ protected readonly eventService: EventService;
8
+ protected readonly dockerService: DockerService;
9
+ protected readonly projectRepository: ProjectRepository;
10
+ protected readonly presetService: PresetService;
11
+ protected readonly presetRepository: PresetRepository;
12
+ constructor(appConfigService: AppConfigService, eventService: EventService, dockerService: DockerService, projectRepository: ProjectRepository, presetService: PresetService, presetRepository: PresetRepository);
13
+ get(name?: string): Project;
14
+ search(params?: SearchParams): Project[];
15
+ searchOne(params?: SearchParams): Project | null;
16
+ save(project: Project): void;
17
+ start(project: Project, restart?: boolean, rebuild?: boolean, attach?: boolean): Promise<void>;
18
+ stop(project: Project): Promise<void>;
19
+ build(project: Project, rebuild?: boolean): Promise<void>;
20
+ logs(project: Project, detach?: boolean): Promise<void>;
21
+ }
@@ -0,0 +1,211 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProjectService = void 0;
13
+ const core_1 = require("@wocker/core");
14
+ const ProjectRepository_1 = require("../repositories/ProjectRepository");
15
+ const docker_1 = require("../../docker");
16
+ const preset_1 = require("../../preset");
17
+ let ProjectService = class ProjectService extends core_1.ProjectService {
18
+ constructor(appConfigService, eventService, dockerService, projectRepository, presetService, presetRepository) {
19
+ super();
20
+ this.appConfigService = appConfigService;
21
+ this.eventService = eventService;
22
+ this.dockerService = dockerService;
23
+ this.projectRepository = projectRepository;
24
+ this.presetService = presetService;
25
+ this.presetRepository = presetRepository;
26
+ }
27
+ get(name) {
28
+ const project = name
29
+ ? this.projectRepository.searchOne({ name })
30
+ : this.projectRepository.searchOne({
31
+ path: this.appConfigService.pwd()
32
+ });
33
+ if (!project) {
34
+ throw new Error("Project not found");
35
+ }
36
+ if (name) {
37
+ this.appConfigService.setPWD(project.path);
38
+ }
39
+ return project;
40
+ }
41
+ search(params = {}) {
42
+ return this.projectRepository.search(params);
43
+ }
44
+ searchOne(params = {}) {
45
+ return this.projectRepository.searchOne(params);
46
+ }
47
+ save(project) {
48
+ this.projectRepository.save(project);
49
+ }
50
+ async start(project, restart, rebuild, attach) {
51
+ if (restart || rebuild) {
52
+ await this.stop(project);
53
+ }
54
+ await this.build(project, rebuild);
55
+ await this.eventService.emit("project:beforeStart", project);
56
+ switch (project.type) {
57
+ case core_1.PROJECT_TYPE_IMAGE:
58
+ case core_1.PROJECT_TYPE_DOCKERFILE:
59
+ case core_1.PROJECT_TYPE_PRESET: {
60
+ let container = await this.dockerService.getContainer(project.containerName);
61
+ const fs = new core_1.FileSystem(project.path);
62
+ if (!container) {
63
+ container = await this.dockerService.createContainer({
64
+ name: project.containerName,
65
+ image: project.imageName,
66
+ env: {
67
+ ...this.appConfigService.config.env || {},
68
+ ...project.env || {}
69
+ },
70
+ ports: project.ports || [],
71
+ volumes: (project.volumes || []).map((volume) => {
72
+ const regVolume = /^([^:]+):([^:]+)(?::([^:]+))?$/;
73
+ const [, source, destination, options] = regVolume.exec(volume);
74
+ if (source.startsWith("/")) {
75
+ return volume;
76
+ }
77
+ return `${fs.path(source)}:${destination}` + (options ? `:${options}` : "");
78
+ }),
79
+ extraHosts: Object.keys(project.extraHosts || {}).map((host) => {
80
+ return `${project.extraHosts[host]}:${host}`;
81
+ })
82
+ });
83
+ }
84
+ const { State: { Status } } = await container.inspect();
85
+ if (Status === "created" || Status === "exited") {
86
+ await container.start();
87
+ }
88
+ break;
89
+ }
90
+ case core_1.PROJECT_TYPE_COMPOSE: {
91
+ break;
92
+ }
93
+ }
94
+ await this.eventService.emit("project:start", project);
95
+ await this.eventService.emit("project:afterStart", project);
96
+ if (attach) {
97
+ switch (project.type) {
98
+ case core_1.PROJECT_TYPE_IMAGE:
99
+ case core_1.PROJECT_TYPE_DOCKERFILE:
100
+ case core_1.PROJECT_TYPE_PRESET:
101
+ await this.dockerService.attach(project.containerName);
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ async stop(project) {
107
+ await this.eventService.emit("project:beforeStop", project);
108
+ switch (project.type) {
109
+ case core_1.PROJECT_TYPE_IMAGE:
110
+ case core_1.PROJECT_TYPE_DOCKERFILE:
111
+ case core_1.PROJECT_TYPE_PRESET:
112
+ await this.dockerService.removeContainer(project.containerName);
113
+ break;
114
+ case core_1.PROJECT_TYPE_COMPOSE:
115
+ break;
116
+ }
117
+ await this.eventService.emit("project:stop", project);
118
+ }
119
+ async build(project, rebuild) {
120
+ switch (project.type) {
121
+ case core_1.PROJECT_TYPE_IMAGE:
122
+ await this.dockerService.pullImage(project.imageName);
123
+ break;
124
+ case core_1.PROJECT_TYPE_DOCKERFILE: {
125
+ project.imageName = `project-${project.name}:develop`;
126
+ project.save();
127
+ if (rebuild) {
128
+ await this.dockerService.imageRm(project.imageName);
129
+ }
130
+ if (!await this.dockerService.imageExists(project.imageName)) {
131
+ await this.dockerService.buildImage({
132
+ tag: project.imageName,
133
+ buildArgs: project.buildArgs,
134
+ context: project.path,
135
+ src: project.dockerfile
136
+ });
137
+ }
138
+ break;
139
+ }
140
+ case core_1.PROJECT_TYPE_PRESET: {
141
+ const preset = this.presetRepository.searchOne({
142
+ name: project.preset
143
+ });
144
+ if (preset.image) {
145
+ await this.dockerService.pullImage(preset.image);
146
+ project.imageName = preset.image;
147
+ project.save();
148
+ }
149
+ if (preset.dockerfile) {
150
+ project.imageName = this.presetService.getImageNameForProject(project, preset);
151
+ project.save();
152
+ if (rebuild) {
153
+ await this.dockerService.imageRm(project.imageName);
154
+ }
155
+ if (!await this.dockerService.imageExists(project.imageName)) {
156
+ await this.dockerService.buildImage({
157
+ tag: project.imageName,
158
+ labels: {
159
+ "org.wocker.preset": preset.name
160
+ },
161
+ buildArgs: project.buildArgs,
162
+ context: preset.path,
163
+ src: preset.dockerfile
164
+ });
165
+ }
166
+ }
167
+ break;
168
+ }
169
+ case core_1.PROJECT_TYPE_COMPOSE: {
170
+ break;
171
+ }
172
+ }
173
+ await this.eventService.emit("project:build", project, rebuild);
174
+ }
175
+ async logs(project, detach) {
176
+ switch (project.type) {
177
+ case core_1.PROJECT_TYPE_IMAGE:
178
+ case core_1.PROJECT_TYPE_DOCKERFILE:
179
+ case core_1.PROJECT_TYPE_PRESET: {
180
+ const container = await this.dockerService.getContainer(project.containerName);
181
+ if (!container) {
182
+ throw new Error("Project not started");
183
+ }
184
+ if (!detach) {
185
+ await this.dockerService.logs(container);
186
+ }
187
+ else {
188
+ const data = await container.logs({
189
+ stdout: true,
190
+ stderr: true,
191
+ follow: false
192
+ });
193
+ process.stdout.write(data);
194
+ }
195
+ break;
196
+ }
197
+ case core_1.PROJECT_TYPE_COMPOSE:
198
+ break;
199
+ }
200
+ }
201
+ };
202
+ exports.ProjectService = ProjectService;
203
+ exports.ProjectService = ProjectService = __decorate([
204
+ (0, core_1.Injectable)("PROJECT_SERVICE"),
205
+ __metadata("design:paramtypes", [core_1.AppConfigService,
206
+ core_1.EventService,
207
+ docker_1.DockerService,
208
+ ProjectRepository_1.ProjectRepository,
209
+ preset_1.PresetService,
210
+ preset_1.PresetRepository])
211
+ ], ProjectService);
@@ -1,5 +1,5 @@
1
1
  import { CertService } from "../services/CertService";
2
- import { ProjectService } from "../../../services/ProjectService";
2
+ import { ProjectService } from "../../project";
3
3
  export declare class CertController {
4
4
  protected readonly projectService: ProjectService;
5
5
  protected readonly certService: CertService;
@@ -15,7 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.CertController = void 0;
16
16
  const core_1 = require("@wocker/core");
17
17
  const CertService_1 = require("../services/CertService");
18
- const ProjectService_1 = require("../../../services/ProjectService");
18
+ const project_1 = require("../../project");
19
19
  let CertController = class CertController {
20
20
  constructor(projectService, certService) {
21
21
  this.projectService = projectService;
@@ -109,6 +109,6 @@ __decorate([
109
109
  ], CertController.prototype, "existsOtherNames", null);
110
110
  exports.CertController = CertController = __decorate([
111
111
  (0, core_1.Controller)(),
112
- __metadata("design:paramtypes", [ProjectService_1.ProjectService,
112
+ __metadata("design:paramtypes", [project_1.ProjectService,
113
113
  CertService_1.CertService])
114
114
  ], CertController);