@theia/dev-container 1.56.0 → 1.57.0-next.112

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 (53) hide show
  1. package/README.md +4 -3
  2. package/lib/electron-browser/container-connection-contribution.d.ts +11 -5
  3. package/lib/electron-browser/container-connection-contribution.d.ts.map +1 -1
  4. package/lib/electron-browser/container-connection-contribution.js +46 -5
  5. package/lib/electron-browser/container-connection-contribution.js.map +1 -1
  6. package/lib/electron-browser/container-info-contribution.d.ts +12 -3
  7. package/lib/electron-browser/container-info-contribution.d.ts.map +1 -1
  8. package/lib/electron-browser/container-info-contribution.js +38 -3
  9. package/lib/electron-browser/container-info-contribution.js.map +1 -1
  10. package/lib/electron-browser/dev-container-frontend-module.d.ts.map +1 -1
  11. package/lib/electron-browser/dev-container-frontend-module.js +5 -0
  12. package/lib/electron-browser/dev-container-frontend-module.js.map +1 -1
  13. package/lib/electron-common/dev-container-workspaces.d.ts +3 -0
  14. package/lib/electron-common/dev-container-workspaces.d.ts.map +1 -0
  15. package/lib/electron-common/dev-container-workspaces.js +21 -0
  16. package/lib/electron-common/dev-container-workspaces.js.map +1 -0
  17. package/lib/electron-common/remote-container-connection-provider.d.ts +2 -1
  18. package/lib/electron-common/remote-container-connection-provider.d.ts.map +1 -1
  19. package/lib/electron-node/dev-container-backend-module.d.ts.map +1 -1
  20. package/lib/electron-node/dev-container-backend-module.js +4 -0
  21. package/lib/electron-node/dev-container-backend-module.js.map +1 -1
  22. package/lib/electron-node/dev-container-file-service.d.ts +1 -1
  23. package/lib/electron-node/dev-container-file-service.d.ts.map +1 -1
  24. package/lib/electron-node/dev-container-file-service.js +2 -6
  25. package/lib/electron-node/dev-container-file-service.js.map +1 -1
  26. package/lib/electron-node/dev-container-workspace-handler.d.ts +7 -0
  27. package/lib/electron-node/dev-container-workspace-handler.d.ts.map +1 -0
  28. package/lib/electron-node/dev-container-workspace-handler.js +21 -0
  29. package/lib/electron-node/dev-container-workspace-handler.js.map +1 -0
  30. package/lib/electron-node/devcontainer-contributions/main-container-creation-contributions.d.ts +3 -0
  31. package/lib/electron-node/devcontainer-contributions/main-container-creation-contributions.d.ts.map +1 -1
  32. package/lib/electron-node/devcontainer-contributions/main-container-creation-contributions.js +25 -2
  33. package/lib/electron-node/devcontainer-contributions/main-container-creation-contributions.js.map +1 -1
  34. package/lib/electron-node/docker-container-service.d.ts +2 -2
  35. package/lib/electron-node/docker-container-service.d.ts.map +1 -1
  36. package/lib/electron-node/docker-container-service.js +6 -5
  37. package/lib/electron-node/docker-container-service.js.map +1 -1
  38. package/lib/electron-node/remote-container-connection-provider.d.ts +2 -1
  39. package/lib/electron-node/remote-container-connection-provider.d.ts.map +1 -1
  40. package/lib/electron-node/remote-container-connection-provider.js +3 -3
  41. package/lib/electron-node/remote-container-connection-provider.js.map +1 -1
  42. package/package.json +7 -7
  43. package/src/electron-browser/container-connection-contribution.ts +58 -10
  44. package/src/electron-browser/container-info-contribution.ts +44 -6
  45. package/src/electron-browser/dev-container-frontend-module.ts +6 -1
  46. package/src/electron-common/dev-container-workspaces.ts +18 -0
  47. package/src/electron-common/remote-container-connection-provider.ts +2 -1
  48. package/src/electron-node/dev-container-backend-module.ts +5 -0
  49. package/src/electron-node/dev-container-file-service.ts +2 -7
  50. package/src/electron-node/dev-container-workspace-handler.ts +33 -0
  51. package/src/electron-node/devcontainer-contributions/main-container-creation-contributions.ts +22 -2
  52. package/src/electron-node/docker-container-service.ts +6 -7
  53. package/src/electron-node/remote-container-connection-provider.ts +3 -3
@@ -30,6 +30,7 @@ export function registerContainerCreationContributions(bind: interfaces.Bind): v
30
30
  bind(ContainerCreationContribution).to(MountsContribution).inSingletonScope();
31
31
  bind(ContainerCreationContribution).to(RemoteUserContribution).inSingletonScope();
32
32
  bind(ContainerCreationContribution).to(PostCreateCommandContribution).inSingletonScope();
33
+ bind(ContainerCreationContribution).to(ContainerEnvContribution).inSingletonScope();
33
34
  }
34
35
 
35
36
  @injectable()
@@ -37,11 +38,16 @@ export class ImageFileContribution implements ContainerCreationContribution {
37
38
  async handleContainerCreation(createOptions: Docker.ContainerCreateOptions, containerConfig: ImageContainer,
38
39
  api: Docker, outputprovider: ContainerOutputProvider): Promise<void> {
39
40
  if (containerConfig.image) {
40
- await new Promise<void>((res, rej) => api.pull(containerConfig.image, {}, (err, stream) => {
41
+ const platform = process.platform;
42
+ const arch = process.arch;
43
+ const options = platform === 'darwin' && arch === 'arm64' ? { platform: 'amd64' } : {};
44
+ await new Promise<void>((res, rej) => api.pull(containerConfig.image, options, (err, stream) => {
41
45
  if (err) {
42
46
  rej(err);
47
+ } else if (stream === undefined) {
48
+ rej('Stream is undefined');
43
49
  } else {
44
- api.modem.followProgress(stream, (error, output) => error ?
50
+ api.modem.followProgress(stream!, (error, output) => error ?
45
51
  rej(error) :
46
52
  res(), progress => outputprovider.onRemoteOutput(OutputHelper.parseProgress(progress)));
47
53
  }
@@ -177,6 +183,20 @@ export class PostCreateCommandContribution implements ContainerCreationContribut
177
183
  }
178
184
  }
179
185
 
186
+ @injectable()
187
+ export class ContainerEnvContribution implements ContainerCreationContribution {
188
+ async handleContainerCreation(createOptions: Docker.ContainerCreateOptions, containerConfig: DevContainerConfiguration): Promise<void> {
189
+ if (containerConfig.containerEnv) {
190
+ if (createOptions.Env === undefined) {
191
+ createOptions.Env = [];
192
+ }
193
+ for (const [key, value] of Object.entries(containerConfig.containerEnv)) {
194
+ createOptions.Env.push(`${key}=${value}`);
195
+ }
196
+ }
197
+ }
198
+ }
199
+
180
200
  export namespace OutputHelper {
181
201
  export interface Progress {
182
202
  id?: string;
@@ -19,7 +19,7 @@ import { inject, injectable, named } from '@theia/core/shared/inversify';
19
19
  import { WorkspaceServer } from '@theia/workspace/lib/common';
20
20
  import * as fs from '@theia/core/shared/fs-extra';
21
21
  import * as Docker from 'dockerode';
22
- import { LastContainerInfo } from '../electron-common/remote-container-connection-provider';
22
+ import { ContainerConnectionOptions } from '../electron-common/remote-container-connection-provider';
23
23
  import { DevContainerConfiguration } from './devcontainer-file';
24
24
  import { DevContainerFileService } from './dev-container-file-service';
25
25
  import { ContainerOutputProvider } from '../electron-common/container-output-provider';
@@ -60,15 +60,14 @@ export class DockerContainerService {
60
60
  @inject(DevContainerFileService)
61
61
  protected readonly devContainerFileService: DevContainerFileService;
62
62
 
63
- async getOrCreateContainer(docker: Docker, devcontainerFile: string,
64
- lastContainerInfo?: LastContainerInfo, outputProvider?: ContainerOutputProvider): Promise<Docker.Container> {
63
+ async getOrCreateContainer(docker: Docker, options: ContainerConnectionOptions, outputProvider?: ContainerOutputProvider): Promise<Docker.Container> {
65
64
  let container;
66
65
 
67
- const workspace = new URI(await this.workspaceServer.getMostRecentlyUsedWorkspace());
66
+ const workspace = new URI(options.workspaceUri ?? await this.workspaceServer.getMostRecentlyUsedWorkspace());
68
67
 
69
- if (lastContainerInfo && fs.statSync(devcontainerFile).mtimeMs < lastContainerInfo.lastUsed) {
68
+ if (options.lastContainerInfo && fs.statSync(options.devcontainerFile).mtimeMs < options.lastContainerInfo.lastUsed) {
70
69
  try {
71
- container = docker.getContainer(lastContainerInfo.id);
70
+ container = docker.getContainer(options.lastContainerInfo.id);
72
71
  if ((await container.inspect()).State.Running) {
73
72
  await container.restart();
74
73
  } else {
@@ -80,7 +79,7 @@ export class DockerContainerService {
80
79
  }
81
80
  }
82
81
  if (!container) {
83
- container = await this.buildContainer(docker, devcontainerFile, workspace, outputProvider);
82
+ container = await this.buildContainer(docker, options.devcontainerFile, workspace, outputProvider);
84
83
  }
85
84
  return container;
86
85
  }
@@ -79,7 +79,7 @@ export class DevContainerConnectionProvider implements RemoteContainerConnection
79
79
  text: 'Creating container',
80
80
  });
81
81
  try {
82
- const container = await this.containerService.getOrCreateContainer(dockerConnection, options.devcontainerFile, options.lastContainerInfo, this.outputProvider);
82
+ const container = await this.containerService.getOrCreateContainer(dockerConnection, options, this.outputProvider);
83
83
  const devContainerConfig = await this.devContainerFileService.getConfiguration(options.devcontainerFile);
84
84
 
85
85
  // create actual connection
@@ -121,8 +121,8 @@ export class DevContainerConnectionProvider implements RemoteContainerConnection
121
121
  }
122
122
  }
123
123
 
124
- getDevContainerFiles(): Promise<DevContainerFile[]> {
125
- return this.devContainerFileService.getAvailableFiles();
124
+ getDevContainerFiles(workspacePath: string): Promise<DevContainerFile[]> {
125
+ return this.devContainerFileService.getAvailableFiles(workspacePath);
126
126
  }
127
127
 
128
128
  async createContainerConnection(container: Docker.Container, docker: Docker, name?: string): Promise<RemoteDockerContainerConnection> {