@wocker/ws 1.0.25 → 1.0.27

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 (130) hide show
  1. package/README.md +1 -1
  2. package/lib/AppModule.d.ts +0 -4
  3. package/lib/AppModule.js +44 -48
  4. package/lib/env.d.ts +2 -3
  5. package/lib/env.js +12 -42
  6. package/lib/main.d.ts +2 -3
  7. package/lib/main.js +23 -25
  8. package/lib/makes/GithubClient.d.ts +24 -3
  9. package/lib/makes/GithubClient.js +20 -6
  10. package/lib/makes/Version.d.ts +22 -0
  11. package/lib/makes/Version.js +59 -0
  12. package/lib/makes/VersionRange.d.ts +6 -0
  13. package/lib/makes/VersionRange.js +18 -0
  14. package/lib/makes/VersionRule.d.ts +24 -0
  15. package/lib/makes/VersionRule.js +68 -0
  16. package/lib/makes/index.d.ts +2 -0
  17. package/lib/makes/index.js +2 -0
  18. package/lib/modules/core/index.js +7 -26
  19. package/lib/modules/dns/controllers/DnsController.d.ts +7 -0
  20. package/lib/modules/dns/controllers/DnsController.js +47 -0
  21. package/lib/modules/dns/index.d.ts +4 -0
  22. package/lib/modules/dns/index.js +44 -0
  23. package/lib/modules/dns/services/DnsService.d.ts +10 -0
  24. package/lib/modules/dns/services/DnsService.js +77 -0
  25. package/lib/modules/index.d.ts +3 -1
  26. package/lib/modules/index.js +3 -1
  27. package/lib/modules/keystore/controllers/KeystoreController.d.ts +0 -3
  28. package/lib/modules/keystore/controllers/KeystoreController.js +3 -54
  29. package/lib/modules/keystore/services/KeystoreService.d.ts +1 -0
  30. package/lib/modules/keystore/services/KeystoreService.js +4 -0
  31. package/lib/modules/keystore/utils/createEncryptionKey.d.ts +1 -1
  32. package/lib/modules/package-manager/index.d.ts +5 -0
  33. package/lib/modules/package-manager/index.js +33 -0
  34. package/lib/modules/package-manager/providers/NpmProvider.d.ts +7 -0
  35. package/lib/modules/package-manager/providers/NpmProvider.js +39 -0
  36. package/lib/modules/package-manager/providers/PnpmProvider.d.ts +7 -0
  37. package/lib/modules/package-manager/providers/PnpmProvider.js +30 -0
  38. package/lib/modules/package-manager/providers/YarnProvider.d.ts +7 -0
  39. package/lib/modules/package-manager/providers/YarnProvider.js +29 -0
  40. package/lib/modules/package-manager/service/PackageManager.d.ts +10 -0
  41. package/lib/modules/package-manager/service/PackageManager.js +70 -0
  42. package/lib/modules/package-manager/service/RegistryService.d.ts +4 -0
  43. package/lib/{services/NpmService.js → modules/package-manager/service/RegistryService.js} +6 -11
  44. package/lib/modules/package-manager/types/Package.d.ts +4 -0
  45. package/lib/modules/package-manager/types/PackageManagerProvider.d.ts +6 -0
  46. package/lib/modules/package-manager/types/PackageManagerProvider.js +6 -0
  47. package/lib/{controllers → modules/plugin/controllers}/PluginController.d.ts +2 -2
  48. package/lib/{controllers → modules/plugin/controllers}/PluginController.js +21 -20
  49. package/lib/modules/plugin/index.d.ts +4 -0
  50. package/lib/modules/plugin/index.js +67 -0
  51. package/lib/{services → modules/plugin/services}/PluginService.d.ts +7 -5
  52. package/lib/{services → modules/plugin/services}/PluginService.js +38 -40
  53. package/lib/modules/preset/controllers/PresetController.d.ts +2 -2
  54. package/lib/modules/preset/controllers/PresetController.js +14 -8
  55. package/lib/modules/preset/controllers/PresetListener.d.ts +1 -1
  56. package/lib/modules/preset/controllers/PresetListener.js +2 -2
  57. package/lib/modules/preset/index.js +5 -2
  58. package/lib/modules/preset/repositories/PresetRepository.d.ts +3 -2
  59. package/lib/modules/preset/repositories/PresetRepository.js +9 -4
  60. package/lib/modules/preset/services/PresetService.d.ts +2 -1
  61. package/lib/modules/preset/services/PresetService.js +74 -14
  62. package/lib/modules/project/controllers/ProjectController.d.ts +37 -2
  63. package/lib/modules/project/controllers/ProjectController.js +837 -7
  64. package/lib/modules/project/controllers/SecretsController.d.ts +8 -0
  65. package/lib/modules/project/controllers/SecretsController.js +72 -0
  66. package/lib/modules/project/index.js +11 -4
  67. package/lib/modules/project/repositories/ProjectRepository.d.ts +3 -6
  68. package/lib/modules/project/repositories/ProjectRepository.js +9 -28
  69. package/lib/modules/project/services/ProjectService.d.ts +5 -3
  70. package/lib/modules/project/services/ProjectService.js +59 -4
  71. package/lib/modules/proxy/controllers/ProxyController.d.ts +1 -2
  72. package/lib/modules/proxy/controllers/ProxyController.js +1 -2
  73. package/lib/modules/proxy/index.js +5 -2
  74. package/lib/modules/proxy/services/CertService.d.ts +1 -1
  75. package/lib/modules/proxy/services/CertService.js +3 -3
  76. package/lib/modules/proxy/services/ProxyService.d.ts +2 -1
  77. package/lib/modules/proxy/services/ProxyService.js +7 -3
  78. package/lib/utils/exec.js +4 -1
  79. package/lib/utils/get-cursor-position.js +1 -1
  80. package/package.json +16 -15
  81. package/plugins/dns/Dockerfile +35 -0
  82. package/plugins/dns/app/Procfile +2 -0
  83. package/plugins/dns/app/dnsmasq.conf.tmpl +11 -0
  84. package/plugins/dns/app/dnsmasq.sh +28 -0
  85. package/plugins/proxmox/Dockerfile +35 -0
  86. package/plugins/proxy/Dockerfile +23 -0
  87. package/plugins/proxy/Procfile +2 -0
  88. package/plugins/proxy/bin/wocker-create-ca +19 -0
  89. package/plugins/proxy/bin/wocker-create-cert +38 -0
  90. package/plugins/proxy/bin/wocker-create-domains +21 -0
  91. package/presets/shopify/Dockerfile +160 -0
  92. package/presets/shopify/bin/compare-version +3 -0
  93. package/presets/shopify/config.json +26 -0
  94. package/presets/shopify/etc/apache2/apache2.conf +230 -0
  95. package/presets/shopify/etc/apache2/mods-available/mpm_prefork.conf +16 -0
  96. package/presets/shopify/etc/apache2/sites-available/000-default.conf +21 -0
  97. package/bin/ws.js +0 -6
  98. package/lib/controllers/ProjectController.d.ts +0 -44
  99. package/lib/controllers/ProjectController.js +0 -956
  100. package/lib/controllers/index.d.ts +0 -5
  101. package/lib/controllers/index.js +0 -21
  102. package/lib/modules/docker/index.d.ts +0 -9
  103. package/lib/modules/docker/index.js +0 -45
  104. package/lib/modules/docker/services/ComposeService.d.ts +0 -32
  105. package/lib/modules/docker/services/ComposeService.js +0 -129
  106. package/lib/modules/docker/services/ContainerService.d.ts +0 -14
  107. package/lib/modules/docker/services/ContainerService.js +0 -115
  108. package/lib/modules/docker/services/DockerService.d.ts +0 -31
  109. package/lib/modules/docker/services/DockerService.js +0 -246
  110. package/lib/modules/docker/services/ImageService.d.ts +0 -12
  111. package/lib/modules/docker/services/ImageService.js +0 -80
  112. package/lib/modules/docker/services/ModemService.d.ts +0 -16
  113. package/lib/modules/docker/services/ModemService.js +0 -157
  114. package/lib/modules/docker/services/ProtoService.d.ts +0 -6
  115. package/lib/modules/docker/services/ProtoService.js +0 -20
  116. package/lib/modules/docker/type/ComposeConfig.d.ts +0 -12
  117. package/lib/modules/docker/utils/formatSizeUnits.d.ts +0 -1
  118. package/lib/modules/docker/utils/formatSizeUnits.js +0 -19
  119. package/lib/services/NpmService.d.ts +0 -5
  120. package/lib/types/index.d.ts +0 -1
  121. package/lib/types/index.js +0 -17
  122. /package/lib/{controllers → modules/core/controllers}/CompletionController.d.ts +0 -0
  123. /package/lib/{controllers → modules/core/controllers}/CompletionController.js +0 -0
  124. /package/lib/{controllers → modules/core/controllers}/DebugController.d.ts +0 -0
  125. /package/lib/{controllers → modules/core/controllers}/DebugController.js +0 -0
  126. /package/lib/{controllers → modules/core/controllers}/ExperimentalController.d.ts +0 -0
  127. /package/lib/{controllers → modules/core/controllers}/ExperimentalController.js +0 -0
  128. /package/lib/modules/{docker/type/ComposeConfig.js → package-manager/types/Package.js} +0 -0
  129. /package/lib/{types → modules/package-manager/types}/PackageInfo.d.ts +0 -0
  130. /package/lib/{types → modules/package-manager/types}/PackageInfo.js +0 -0
@@ -0,0 +1,8 @@
1
+ import { ProjectService } from "../services/ProjectService";
2
+ export declare class SecretsController {
3
+ protected readonly projectService: ProjectService;
4
+ constructor(projectService: ProjectService);
5
+ create(secret?: string, name?: string): Promise<void>;
6
+ inspect(secret?: string, name?: string): Promise<string | undefined>;
7
+ rm(secret?: string, name?: string): Promise<void>;
8
+ }
@@ -0,0 +1,72 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SecretsController = void 0;
16
+ const core_1 = require("@wocker/core");
17
+ const utils_1 = require("@wocker/utils");
18
+ const ProjectService_1 = require("../services/ProjectService");
19
+ let SecretsController = class SecretsController {
20
+ constructor(projectService) {
21
+ this.projectService = projectService;
22
+ }
23
+ async create(secret, name) {
24
+ const project = this.projectService.get(name);
25
+ const value = await (0, utils_1.promptInput)({
26
+ message: "Secret value",
27
+ type: "password"
28
+ });
29
+ await project.setSecret(secret, value);
30
+ }
31
+ async inspect(secret, name) {
32
+ const project = this.projectService.get(name);
33
+ return project.getSecret(secret);
34
+ }
35
+ async rm(secret, name) {
36
+ const project = this.projectService.get(name);
37
+ await project.unsetSecret(secret);
38
+ }
39
+ };
40
+ exports.SecretsController = SecretsController;
41
+ __decorate([
42
+ (0, core_1.Command)("secret:create [secret]"),
43
+ (0, core_1.Description)("Adds project secret value to keystore"),
44
+ __param(0, (0, core_1.Param)("secret")),
45
+ __param(1, (0, core_1.Option)("name", "n")),
46
+ __metadata("design:type", Function),
47
+ __metadata("design:paramtypes", [String, String]),
48
+ __metadata("design:returntype", Promise)
49
+ ], SecretsController.prototype, "create", null);
50
+ __decorate([
51
+ (0, core_1.Command)("secret:inspect [secret]"),
52
+ (0, core_1.Description)("Inspect secret value"),
53
+ __param(0, (0, core_1.Param)("secret")),
54
+ __param(1, (0, core_1.Option)("name", "n")),
55
+ __metadata("design:type", Function),
56
+ __metadata("design:paramtypes", [String, String]),
57
+ __metadata("design:returntype", Promise)
58
+ ], SecretsController.prototype, "inspect", null);
59
+ __decorate([
60
+ (0, core_1.Command)("secret:rm [secret]"),
61
+ (0, core_1.Description)("Delete secret value"),
62
+ __param(0, (0, core_1.Param)("secret")),
63
+ __param(1, (0, core_1.Option)("name", "n")),
64
+ __metadata("design:type", Function),
65
+ __metadata("design:paramtypes", [String, String]),
66
+ __metadata("design:returntype", Promise)
67
+ ], SecretsController.prototype, "rm", null);
68
+ exports.SecretsController = SecretsController = __decorate([
69
+ (0, core_1.Controller)(),
70
+ (0, core_1.Description)("Project secret commands"),
71
+ __metadata("design:paramtypes", [ProjectService_1.ProjectService])
72
+ ], SecretsController);
@@ -5,13 +5,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
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
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.ProjectService = exports.ProjectRepository = exports.ProjectModule = void 0;
10
13
  const core_1 = require("@wocker/core");
14
+ const docker_module_1 = __importDefault(require("@wocker/docker-module"));
11
15
  const keystore_1 = require("../keystore");
12
- const docker_1 = require("../docker");
13
16
  const preset_1 = require("../preset");
14
17
  const ProjectController_1 = require("./controllers/ProjectController");
18
+ const SecretsController_1 = require("./controllers/SecretsController");
15
19
  const ProjectRepository_1 = require("./repositories/ProjectRepository");
16
20
  Object.defineProperty(exports, "ProjectRepository", { enumerable: true, get: function () { return ProjectRepository_1.ProjectRepository; } });
17
21
  const ProjectService_1 = require("./services/ProjectService");
@@ -22,11 +26,14 @@ exports.ProjectModule = ProjectModule;
22
26
  exports.ProjectModule = ProjectModule = __decorate([
23
27
  (0, core_1.Module)({
24
28
  imports: [
25
- preset_1.PresetModule,
29
+ docker_module_1.default,
26
30
  keystore_1.KeystoreModule,
27
- docker_1.DockerModule
31
+ preset_1.PresetModule
32
+ ],
33
+ controllers: [
34
+ ProjectController_1.ProjectController,
35
+ SecretsController_1.SecretsController
28
36
  ],
29
- controllers: [ProjectController_1.ProjectController],
30
37
  providers: [
31
38
  ProjectRepository_1.ProjectRepository,
32
39
  ProjectService_1.ProjectService
@@ -1,12 +1,9 @@
1
- import { AppConfigService, AppFileSystemService, Project, ProjectProperties, ProjectServiceSearchParams as SearchParams } from "@wocker/core";
2
- import { KeystoreService } from "../../keystore";
3
- export declare class ProjectRepository {
1
+ import { AppConfigService, AppFileSystemService, Project, ProjectRepository as CoreProjectRepository, ProjectRepositorySearchParams as SearchParams } from "@wocker/core";
2
+ export declare class ProjectRepository extends CoreProjectRepository {
4
3
  protected readonly appConfigService: AppConfigService;
5
4
  protected readonly fs: AppFileSystemService;
6
- protected readonly keystoreService: KeystoreService;
7
- constructor(appConfigService: AppConfigService, fs: AppFileSystemService, keystoreService: KeystoreService);
5
+ constructor(appConfigService: AppConfigService, fs: AppFileSystemService);
8
6
  getByName(name: string): Project;
9
- fromObject(data: Partial<ProjectProperties>): Project;
10
7
  save(project: Project): void;
11
8
  search(params?: SearchParams): Project[];
12
9
  searchOne(params?: SearchParams): Project | null;
@@ -11,37 +11,19 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ProjectRepository = void 0;
13
13
  const core_1 = require("@wocker/core");
14
- const keystore_1 = require("../../keystore");
15
- let ProjectRepository = class ProjectRepository {
16
- constructor(appConfigService, fs, keystoreService) {
14
+ let ProjectRepository = class ProjectRepository extends core_1.ProjectRepository {
15
+ constructor(appConfigService, fs) {
16
+ super();
17
17
  this.appConfigService = appConfigService;
18
18
  this.fs = fs;
19
- this.keystoreService = keystoreService;
20
19
  }
21
20
  getByName(name) {
22
21
  const ref = this.appConfigService.config.getProject(name), config = this.fs.readJSON(`projects/${name}/config.json`);
23
- return this.fromObject({
22
+ return new core_1.Project({
24
23
  ...config,
25
24
  path: ref.path
26
25
  });
27
26
  }
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
27
  save(project) {
46
28
  if (!project.name) {
47
29
  throw new Error("Project should has a name");
@@ -52,14 +34,14 @@ let ProjectRepository = class ProjectRepository {
52
34
  if (!project.id) {
53
35
  project.id = project.name;
54
36
  }
55
- if (!this.fs.exists(`projects/${project.id}`)) {
56
- this.fs.mkdir(`projects/${project.id}`, {
37
+ if (!this.fs.exists(`projects/${project.name}`)) {
38
+ this.fs.mkdir(`projects/${project.name}`, {
57
39
  recursive: true
58
40
  });
59
41
  }
60
42
  const { path, ...rest } = project.toObject();
61
- this.appConfigService.addProject(project.id, project.name, path);
62
- this.fs.writeJSON(`projects/${project.id}/config.json`, rest);
43
+ this.appConfigService.addProject(project.name, path);
44
+ this.fs.writeJSON(`projects/${project.name}/config.json`, rest);
63
45
  this.appConfigService.save();
64
46
  }
65
47
  search(params = {}) {
@@ -85,6 +67,5 @@ exports.ProjectRepository = ProjectRepository;
85
67
  exports.ProjectRepository = ProjectRepository = __decorate([
86
68
  (0, core_1.Injectable)(),
87
69
  __metadata("design:paramtypes", [core_1.AppConfigService,
88
- core_1.AppFileSystemService,
89
- keystore_1.KeystoreService])
70
+ core_1.AppFileSystemService])
90
71
  ], ProjectRepository);
@@ -1,6 +1,6 @@
1
- import { Project, AppConfigService, EventService, ProcessService, ProjectService as CoreProjectService, ProjectServiceSearchParams as SearchParams, LogService } from "@wocker/core";
2
- import { DockerService, ComposeService } from "../../docker";
3
- import { PresetService, PresetRepository } from "../../preset";
1
+ import { AppConfigService, EventService, LogService, ProcessService, Project, ProjectService as CoreProjectService, ProjectRepositorySearchParams as SearchParams } from "@wocker/core";
2
+ import { ComposeService, DockerService } from "@wocker/docker-module";
3
+ import { PresetRepository, PresetService } from "../../preset";
4
4
  import { ProjectRepository } from "../repositories/ProjectRepository";
5
5
  export declare class ProjectService extends CoreProjectService {
6
6
  protected readonly appConfigService: AppConfigService;
@@ -20,6 +20,8 @@ export declare class ProjectService extends CoreProjectService {
20
20
  start(project: Project, restart?: boolean, rebuild?: boolean, attach?: boolean): Promise<void>;
21
21
  stop(project: Project): Promise<void>;
22
22
  build(project: Project, rebuild?: boolean): Promise<void>;
23
+ attach(project: Project): Promise<void>;
24
+ run(project: Project, script: string, service?: string, args?: string[]): Promise<void>;
23
25
  exec(project: Project, command: string[]): Promise<void>;
24
26
  logs(project: Project, detach?: boolean): Promise<void>;
25
27
  }
@@ -11,9 +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("../../docker");
14
+ const docker_module_1 = require("@wocker/docker-module");
15
+ const cli_1 = require("@kearisp/cli");
15
16
  const preset_1 = require("../../preset");
16
17
  const ProjectRepository_1 = require("../repositories/ProjectRepository");
18
+ class PublicCli extends cli_1.Cli {
19
+ parseCommand(command, index) {
20
+ return super.parseCommand(command, index);
21
+ }
22
+ }
17
23
  let ProjectService = class ProjectService extends core_1.ProjectService {
18
24
  constructor(appConfigService, processService, eventService, dockerService, composeService, projectRepository, presetService, presetRepository, logService) {
19
25
  super();
@@ -66,6 +72,7 @@ let ProjectService = class ProjectService extends core_1.ProjectService {
66
72
  container = await this.dockerService.createContainer({
67
73
  name: project.containerName,
68
74
  image: project.imageName,
75
+ cmd: project.cmd,
69
76
  env: {
70
77
  ...this.appConfigService.config.env || {},
71
78
  ...project.env || {}
@@ -175,7 +182,9 @@ let ProjectService = class ProjectService extends core_1.ProjectService {
175
182
  "org.wocker.preset": preset.name
176
183
  },
177
184
  buildArgs: project.buildArgs,
178
- context: preset.path,
185
+ context: project.presetMode === "project"
186
+ ? [preset.path, project.path]
187
+ : preset.path,
179
188
  dockerfile: preset.dockerfile
180
189
  });
181
190
  }
@@ -192,6 +201,52 @@ let ProjectService = class ProjectService extends core_1.ProjectService {
192
201
  }
193
202
  await this.eventService.emit("project:build", project, rebuild);
194
203
  }
204
+ async attach(project) {
205
+ switch (project.type) {
206
+ case core_1.PROJECT_TYPE_IMAGE:
207
+ case core_1.PROJECT_TYPE_DOCKERFILE:
208
+ case core_1.PROJECT_TYPE_PRESET: {
209
+ await this.dockerService.attach(project.containerName);
210
+ break;
211
+ }
212
+ }
213
+ }
214
+ async run(project, script, service, args = []) {
215
+ if (!project.scripts || !project.scripts[script]) {
216
+ throw new Error(`Script ${script} not found`);
217
+ }
218
+ switch (project.type) {
219
+ case core_1.PROJECT_TYPE_IMAGE:
220
+ case core_1.PROJECT_TYPE_DOCKERFILE:
221
+ case core_1.PROJECT_TYPE_PRESET: {
222
+ const container = await this.dockerService.getContainer(project.containerName);
223
+ if (!container) {
224
+ throw new Error("The project is not started");
225
+ }
226
+ const cli = new PublicCli();
227
+ const cmd = cli.parseCommand(`command ${project.scripts[script]}`, 0);
228
+ this.logService.debug(cmd);
229
+ const exec = await container.exec({
230
+ AttachStdin: true,
231
+ AttachStdout: true,
232
+ AttachStderr: true,
233
+ Tty: process.stdin.isTTY,
234
+ Cmd: [...cmd, ...args || []]
235
+ });
236
+ const stream = await exec.start({
237
+ hijack: true,
238
+ stdin: true,
239
+ Tty: process.stdin.isTTY
240
+ });
241
+ await this.dockerService.attachStream(stream);
242
+ break;
243
+ }
244
+ case core_1.PROJECT_TYPE_COMPOSE: {
245
+ console.log(service, script, args);
246
+ break;
247
+ }
248
+ }
249
+ }
195
250
  async exec(project, command) {
196
251
  switch (project.type) {
197
252
  case core_1.PROJECT_TYPE_IMAGE:
@@ -244,8 +299,8 @@ exports.ProjectService = ProjectService = __decorate([
244
299
  __metadata("design:paramtypes", [core_1.AppConfigService,
245
300
  core_1.ProcessService,
246
301
  core_1.EventService,
247
- docker_1.DockerService,
248
- docker_1.ComposeService,
302
+ docker_module_1.DockerService,
303
+ docker_module_1.ComposeService,
249
304
  ProjectRepository_1.ProjectRepository,
250
305
  preset_1.PresetService,
251
306
  preset_1.PresetRepository,
@@ -6,10 +6,9 @@ export declare class ProxyController {
6
6
  protected readonly eventService: EventService;
7
7
  protected readonly projectService: ProjectService;
8
8
  protected readonly proxyService: ProxyService;
9
- protected containerName: string;
10
9
  constructor(appConfigService: AppConfigService, eventService: EventService, projectService: ProjectService, proxyService: ProxyService);
11
10
  onProjectStart(project: Project): Promise<void>;
12
- onProjectStop(project: Project): Promise<void>;
11
+ onProjectStop(_project: Project): Promise<void>;
13
12
  getProjectNames(): string[];
14
13
  init(httpPort?: number, httpsPort?: number, sshPort?: number, sshPassword?: string): Promise<void>;
15
14
  start(restart?: boolean, rebuild?: boolean): Promise<void>;
@@ -27,7 +27,6 @@ let ProxyController = class ProxyController {
27
27
  this.eventService = eventService;
28
28
  this.projectService = projectService;
29
29
  this.proxyService = proxyService;
30
- this.containerName = "proxy.workspace";
31
30
  this.eventService.on("project:init", (project) => this.proxyService.init(project));
32
31
  this.eventService.on("project:start", (project) => this.onProjectStart(project));
33
32
  this.eventService.on("project:stop", (project) => this.onProjectStop(project));
@@ -42,7 +41,7 @@ let ProxyController = class ProxyController {
42
41
  }
43
42
  await this.start();
44
43
  }
45
- async onProjectStop(project) {
44
+ async onProjectStop(_project) {
46
45
  }
47
46
  getProjectNames() {
48
47
  const projects = this.projectService.search();
@@ -5,10 +5,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
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
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.CertService = exports.ProxyService = exports.ProxyModule = void 0;
10
13
  const core_1 = require("@wocker/core");
11
- const docker_1 = require("../docker");
14
+ const docker_module_1 = __importDefault(require("@wocker/docker-module"));
12
15
  const project_1 = require("../project");
13
16
  const CertController_1 = require("./controllers/CertController");
14
17
  const ProxyController_1 = require("./controllers/ProxyController");
@@ -22,7 +25,7 @@ exports.ProxyModule = ProxyModule;
22
25
  exports.ProxyModule = ProxyModule = __decorate([
23
26
  (0, core_1.Module)({
24
27
  imports: [
25
- docker_1.DockerModule,
28
+ docker_module_1.default,
26
29
  project_1.ProjectModule
27
30
  ],
28
31
  controllers: [
@@ -1,5 +1,5 @@
1
1
  import { Project, AppFileSystemService } from "@wocker/core";
2
- import { DockerService } from "../../docker";
2
+ import { DockerService } from "@wocker/docker-module";
3
3
  import { ProxyService } from "./ProxyService";
4
4
  type CertMap = {
5
5
  [name: string]: string[];
@@ -47,9 +47,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.CertService = void 0;
49
49
  const core_1 = require("@wocker/core");
50
+ const docker_module_1 = require("@wocker/docker-module");
50
51
  const Path = __importStar(require("path"));
51
52
  const cli_table3_1 = __importDefault(require("cli-table3"));
52
- const docker_1 = require("../../docker");
53
53
  const ProxyService_1 = require("./ProxyService");
54
54
  let CertService = class CertService {
55
55
  constructor(fs, proxyService, dockerService) {
@@ -72,7 +72,7 @@ let CertService = class CertService {
72
72
  throw new Error("Cert name missing");
73
73
  }
74
74
  await this.proxyService.start();
75
- const container = await this.dockerService.getContainer("proxy.workspace");
75
+ const container = await this.dockerService.getContainer("wocker-proxy");
76
76
  if (!container) {
77
77
  throw new Error("Proxy not started");
78
78
  }
@@ -146,5 +146,5 @@ exports.CertService = CertService = __decorate([
146
146
  (0, core_1.Injectable)(),
147
147
  __metadata("design:paramtypes", [core_1.AppFileSystemService,
148
148
  ProxyService_1.ProxyService,
149
- docker_1.DockerService])
149
+ docker_module_1.DockerService])
150
150
  ], CertService);
@@ -1,10 +1,11 @@
1
1
  import { Project, AppConfigService, AppFileSystemService, ProxyService as CoreProxyService } from "@wocker/core";
2
- import { DockerService } from "../../docker";
2
+ import { DockerService } from "@wocker/docker-module";
3
3
  export declare class ProxyService extends CoreProxyService {
4
4
  protected readonly appConfigService: AppConfigService;
5
5
  protected readonly fs: AppFileSystemService;
6
6
  protected readonly dockerService: DockerService;
7
7
  protected containerName: string;
8
+ protected oldContainerNames: string[];
8
9
  protected imageName: string;
9
10
  protected oldImages: string[];
10
11
  constructor(appConfigService: AppConfigService, fs: AppFileSystemService, dockerService: DockerService);
@@ -44,17 +44,18 @@ var __metadata = (this && this.__metadata) || function (k, v) {
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.ProxyService = void 0;
46
46
  const core_1 = require("@wocker/core");
47
+ const docker_module_1 = require("@wocker/docker-module");
47
48
  const utils_1 = require("@wocker/utils");
48
49
  const Path = __importStar(require("path"));
49
50
  const env_1 = require("../../../env");
50
- const docker_1 = require("../../docker");
51
51
  let ProxyService = class ProxyService extends core_1.ProxyService {
52
52
  constructor(appConfigService, fs, dockerService) {
53
53
  super();
54
54
  this.appConfigService = appConfigService;
55
55
  this.fs = fs;
56
56
  this.dockerService = dockerService;
57
- this.containerName = "proxy.workspace";
57
+ this.containerName = "wocker-proxy";
58
+ this.oldContainerNames = ["proxy.workspace"];
58
59
  this.imageName = "wocker-proxy:1.0.1";
59
60
  this.oldImages = [
60
61
  "wocker-proxy:1.0.0"
@@ -75,6 +76,9 @@ let ProxyService = class ProxyService extends core_1.ProxyService {
75
76
  }
76
77
  let container = await this.dockerService.getContainer(this.containerName);
77
78
  if (!container) {
79
+ for (const containerName of this.oldContainerNames) {
80
+ await this.dockerService.removeContainer(containerName);
81
+ }
78
82
  console.info("Proxy starting...");
79
83
  await this.build(rebuild);
80
84
  const fs = this.fs;
@@ -163,5 +167,5 @@ exports.ProxyService = ProxyService = __decorate([
163
167
  (0, core_1.Injectable)("PROXY_SERVICE"),
164
168
  __metadata("design:paramtypes", [core_1.AppConfigService,
165
169
  core_1.AppFileSystemService,
166
- docker_1.DockerService])
170
+ docker_module_1.DockerService])
167
171
  ], ProxyService);
package/lib/utils/exec.js CHANGED
@@ -8,10 +8,13 @@ const exec = async (command, options) => {
8
8
  maxBuffer: Infinity
9
9
  });
10
10
  return new Promise((resolve, reject) => {
11
- let data = "";
11
+ let data = "", errData = "";
12
12
  worker.stdout.on("data", (chunk) => {
13
13
  data += chunk.toString();
14
14
  });
15
+ worker.stderr.on("data", (chunk) => {
16
+ errData += chunk.toString();
17
+ });
15
18
  worker.on("exit", (code) => {
16
19
  if (code !== 0) {
17
20
  reject(new Error(`Process exited with code ${code}`));
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCursorPosition = void 0;
4
- const code = '\x1b[6n';
4
+ const code = "\x1b[6n";
5
5
  const getCursorPosition = async () => {
6
6
  process.stdin.resume();
7
7
  process.stdin.setRawMode(true);
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@wocker/ws",
3
- "version": "1.0.25",
3
+ "type": "commonjs",
4
+ "version": "1.0.27",
4
5
  "author": "Kris Papercut <krispcut@gmail.com>",
5
6
  "description": "Docker workspace for web projects",
6
7
  "license": "MIT",
@@ -13,7 +14,7 @@
13
14
  "devops"
14
15
  ],
15
16
  "bin": {
16
- "ws": "./bin/ws.js"
17
+ "ws": "lib/main.js"
17
18
  },
18
19
  "homepage": "https://kearisp.github.io/wocker",
19
20
  "repository": {
@@ -27,43 +28,43 @@
27
28
  "prepublishOnly": "npm run build",
28
29
  "start": "npm run watch",
29
30
  "build": "tsc --project tsconfig.build.json",
30
- "watch": "tsc -w --project tsconfig.build.json",
31
+ "postbuild": "chmod +x ./lib/main.js",
32
+ "watch": "npm run build && tsc -w --project tsconfig.build.json",
31
33
  "test": "jest --colors",
32
34
  "test-watch": "jest --colors --watchAll",
33
35
  "make-coverage-badge": "make-coverage-badge"
34
36
  },
35
37
  "dependencies": {
36
- "@wocker/core": "1.0.25",
37
- "@wocker/utils": "^2.0.3",
38
+ "@wocker/core": "1.0.27",
39
+ "@wocker/docker-module": "^0.0.1",
40
+ "@wocker/utils": "^2.0.6",
38
41
  "async-mutex": "^0.4.0",
39
42
  "axios": "^1.6.7",
40
43
  "child_process": "^1.0.2",
41
44
  "cli-table3": "^0.6.2",
42
45
  "docker-compose": "^1.2.0",
43
46
  "dockerode": "^4.0.2",
44
- "fs": "^0.0.1-security",
45
47
  "keytar": "^7.9.0",
46
48
  "md5": "^2.3.0",
47
- "os": "^0.1.2",
48
- "path": "^0.12.7",
49
49
  "protobufjs": "^7.5.1",
50
50
  "unzipper": "^0.12.3",
51
51
  "yoctocolors-cjs": "^2.1.2"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/dockerode": "^3.3.23",
55
- "@types/jest": "^29.5.14",
55
+ "@types/jest": "^30.0.0",
56
56
  "@types/md5": "^2.3.2",
57
57
  "@types/mute-stream": "^0.0.4",
58
- "@types/node": "^24.0.13",
58
+ "@types/node": "^24.5.2",
59
59
  "@types/unzipper": "^0.10.10",
60
- "@wocker/testing": "1.0.2",
61
- "jest": "^29.7.0",
60
+ "@wocker/docker-mock-module": "^0.0.1",
61
+ "@wocker/testing": "^1.0.4",
62
+ "jest": "^30.1.3",
62
63
  "make-coverage-badge": "^1.2.0",
63
- "memfs": "^4.17.0",
64
- "ts-jest": "^29.3.2",
64
+ "memfs": "^4.49.0",
65
+ "ts-jest": "^29.4.4",
65
66
  "ts-node": "^10.9.2",
66
- "typescript": "^5.6.3",
67
+ "typescript": "^5.9.3",
67
68
  "unionfs": "^4.5.4"
68
69
  }
69
70
  }
@@ -0,0 +1,35 @@
1
+ FROM docker.io/nginxproxy/docker-gen:0.15.0 AS docker-gen
2
+
3
+ FROM docker.io/nginxproxy/forego:0.18.3 AS forego
4
+
5
+ FROM alpine:edge
6
+
7
+ RUN set -eu && \
8
+ apk --no-cache add \
9
+ tini \
10
+ bash \
11
+ dnsmasq-dnssec && \
12
+ mkdir -p /etc/default/ && \
13
+ echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq && \
14
+ # rm -f /etc/dnsmasq.conf && \
15
+ rm -rf /tmp/* /var/cache/apk/*
16
+
17
+ #COPY ./dnsmasq.conf.tmpl /app/dnsmasq.conf.tmpl
18
+ #COPY ./Procfile /app/Procfile
19
+
20
+ #RUN wget https://github.com/jwilder/docker-gen/releases/download/0.3.3/docker-gen-linux-amd64-0.3.3.tar.gz && \
21
+ # tar xvzf docker-gen-linux-amd64-0.3.3.tar.gz && \
22
+ # rm docker-gen-linux-amd64-0.3.3.tar.gz && \
23
+ # mv docker-gen /usr/local/bin/
24
+
25
+ # Install Forego + docker-gen
26
+ COPY --from=forego /usr/local/bin/forego /usr/local/bin/forego
27
+ COPY --from=docker-gen /usr/local/bin/docker-gen /usr/local/bin/docker-gen
28
+
29
+ COPY app /app/
30
+ RUN chmod 755 /app/dnsmasq.sh
31
+
32
+ WORKDIR /app/
33
+
34
+ #ENTRYPOINT ["/sbin/tini", "--", "honcho", "-f", "/app/Procfile", "start"]
35
+ CMD ["forego", "start", "-r"]
@@ -0,0 +1,2 @@
1
+ dockergen: docker-gen -watch -notify "pkill -HUP dnsmasq" dnsmasq.conf.tmpl /etc/dnsmasq.conf
2
+ # dnsmasq: /app/dnsmasq.sh
@@ -0,0 +1,11 @@
1
+ {{- $globals := dict }}
2
+ {{- $_ := set $globals "containers" $ }}
3
+
4
+ {{- range $hostname, $containers := groupByMulti $globals.containers "Env.VIRTUAL_HOST" "," }}
5
+ {{ $hostname }}
6
+
7
+ {{- range $container := $containers }}
8
+ {{ printf "%#v" $container.Networks }}
9
+ {{- end }}
10
+ {{- end }}
11
+
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env bash
2
+ set -Eeuo pipefail
3
+
4
+ conf="/etc/dnsmasq.conf"
5
+
6
+ # Check if config file is not a directory
7
+ if [ -d "$conf" ]; then
8
+ echo "The bind $conf maps to a file that does not exist!"
9
+ exit 1
10
+ fi
11
+
12
+ if [ ! -f "$conf" ]; then
13
+ conf="/etc/dnsmasq.custom"
14
+ template="/etc/dnsmasq.default"
15
+
16
+ if [ ! -f "$template" ]; then
17
+ echo "Your /etc directory does not contain a valid dnsmasq.conf file!"
18
+ exit 1
19
+ fi
20
+
21
+ rm -f "$conf"
22
+ cp "$template" "$conf"
23
+
24
+ [ -n "$DNS1" ] && sed -i -e "s/1.0.0.1/$DNS1/g" "$conf"
25
+ [ -n "$DNS2" ] && sed -i -e "s/1.1.1.1/$DNS2/g" "$conf"
26
+ fi
27
+
28
+ exec dnsmasq "--conf-file=$conf" --no-daemon --no-resolv