@forge/cli 6.17.0-next.29 → 6.17.1-next.8

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.
@@ -30,25 +30,23 @@ export declare class InProcessTunnelService implements TunnelService {
30
30
  constructor(ui: UI, startTunnelCommand: StartTunnelCommand, tunnelInteractor: TunnelInteractor, configFilePortFindingService: ConfigFilePortFindingService, analyticsService: TunnelAnalyticsService);
31
31
  run(tunnelOptions: TunnelOptions, creds: PersonalApiCredentialsValidated, debugEnabled: boolean, onError?: (err: Error) => Promise<void>): Promise<void>;
32
32
  }
33
+ interface EnvironmentVariable {
34
+ key: string;
35
+ value: string;
36
+ }
33
37
  declare abstract class TunnelServiceBase implements TunnelService {
34
38
  protected readonly configFilePortFindingService: ConfigFilePortFindingService;
35
39
  constructor(configFilePortFindingService: ConfigFilePortFindingService);
36
40
  abstract run(tunnelOptions: TunnelOptions, creds: PersonalApiCredentialsValidated, debugEnabled: boolean, onError?: (err: Error) => Promise<void>): Promise<void>;
37
- protected getDockerOptions(tunnelOptions: TunnelOptions, debugEnabled: boolean, { email, token }: PersonalApiCredentials): Promise<string[]>;
38
- protected getPortOptions(port: number, resourcePorts: Record<string, number>, cspReporterPort: number | undefined): string[];
39
- protected getResourcePortEnvVarOption(resourcePorts: Record<string, number>): string[];
40
- protected getUserEnvironmentVariablesOptions(): string[];
41
- protected addEnvVarsForLocalTunnel(env: {
42
- [key: string]: string;
43
- }): Record<string, string>;
44
- protected transformDockerOptionsToEnvVars(options: string[]): {
45
- [key: string]: string;
46
- };
47
- protected getInteractiveOptions(): string[];
48
- protected getVolumeOptions(): string[];
41
+ getTunnelProcessEnvironment(tunnelOptions: TunnelOptions, debugEnabled: boolean, { email, token }: PersonalApiCredentials, port: number, cspReporterPort: number | undefined, resourcePorts: Record<string, number>): Promise<EnvironmentVariable[]>;
42
+ private getInspectorPortEnvironment;
43
+ private getCspReporterPortEnvironment;
44
+ private getResourcePortEnvironment;
45
+ private getUserEnvironmentVariables;
49
46
  }
50
47
  export declare class LocalTunnelService extends TunnelServiceBase {
51
48
  run(tunnelOptions: TunnelOptions, creds: PersonalApiCredentialsValidated, debugEnabled: boolean, onError?: (err: Error) => Promise<void>): Promise<void>;
49
+ private formatEnvForLocalTunnel;
52
50
  }
53
51
  export declare class DockerTunnelService extends TunnelServiceBase {
54
52
  private readonly dockerService;
@@ -57,6 +55,11 @@ export declare class DockerTunnelService extends TunnelServiceBase {
57
55
  run(tunnelOptions: TunnelOptions, creds: PersonalApiCredentialsValidated, debugEnabled: boolean): Promise<void>;
58
56
  bootstrapDocker(): Promise<ReturnType<typeof spawn>>;
59
57
  private validateDockerVersion;
58
+ private getDockerPortOptions;
59
+ private formatEnvForDocker;
60
+ private getInteractiveOptions;
61
+ private getVolumeOptions;
62
+ private getDockerOptions;
60
63
  }
61
64
  export {};
62
65
  //# sourceMappingURL=tunnel-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel-service.d.ts","sourceRoot":"","sources":["../../src/service/tunnel-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAMpC,OAAO,EAIL,WAAW,EAEX,sBAAsB,EACtB,+BAA+B,EAG/B,EAAE,EACF,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAcpD,eAAO,MAAM,UAAU,QAEuB,CAAC;AAE/C,qBAAa,uBAAwB,SAAQ,WAAW;IAEpD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,OAAO,EACnC,OAAO,CAAC,EAAE,MAAM;IAKX,WAAW,IAAI,OAAO;CAG9B;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,CACD,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,SAAS;;CAIpD;AAaD,qBAAa,sBAAuB,YAAW,aAAa;IAExD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,4BAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAJhB,EAAE,EAAE,EAAE,EACN,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,gBAAgB,EAClC,4BAA4B,EAAE,4BAA4B,EAC1D,gBAAgB,EAAE,sBAAsB;IAG9C,GAAG,CACd,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;CA2BjB;AAED,uBAAe,iBAAkB,YAAW,aAAa;IAC3C,SAAS,CAAC,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B;gBAA1D,4BAA4B,EAAE,4BAA4B;aAEzE,GAAG,CACjB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;cAEA,gBAAgB,CAC9B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,OAAO,EACrB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,sBAAsB,GACvC,OAAO,CAAC,MAAM,EAAE,CAAC;IAiCpB,SAAS,CAAC,cAAc,CACtB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,MAAM,EAAE;IAwBX,SAAS,CAAC,2BAA2B,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE;IAItF,SAAS,CAAC,kCAAkC,IAAI,MAAM,EAAE;IAUxD,SAAS,CAAC,wBAAwB,CAAC,GAAG,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQ1F,SAAS,CAAC,+BAA+B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;IAYvF,SAAS,CAAC,qBAAqB,IAAI,MAAM,EAAE;IAQ3C,SAAS,CAAC,gBAAgB,IAAI,MAAM,EAAE;CAkBvC;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;IAC1C,GAAG,CACd,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;CA6BjB;AAED,qBAAa,mBAAoB,SAAQ,iBAAiB;IAGtD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAFjC,4BAA4B,EAAE,4BAA4B,EACzC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,sBAAsB;IAK9C,GAAG,CACd,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC;IA6CH,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;YAKnD,qBAAqB;CASpC"}
1
+ {"version":3,"file":"tunnel-service.d.ts","sourceRoot":"","sources":["../../src/service/tunnel-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAMpC,OAAO,EAIL,WAAW,EAEX,sBAAsB,EACtB,+BAA+B,EAG/B,EAAE,EACF,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAcpD,eAAO,MAAM,UAAU,QAEuB,CAAC;AAE/C,qBAAa,uBAAwB,SAAQ,WAAW;IAEpD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,OAAO,EACnC,OAAO,CAAC,EAAE,MAAM;IAKX,WAAW,IAAI,OAAO;CAG9B;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,CACD,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,SAAS;;CAIpD;AAaD,qBAAa,sBAAuB,YAAW,aAAa;IAExD,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,4BAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAJhB,EAAE,EAAE,EAAE,EACN,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,gBAAgB,EAClC,4BAA4B,EAAE,4BAA4B,EAC1D,gBAAgB,EAAE,sBAAsB;IAG9C,GAAG,CACd,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;CA2BjB;AAED,UAAU,mBAAmB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uBAAe,iBAAkB,YAAW,aAAa;IAC3C,SAAS,CAAC,QAAQ,CAAC,4BAA4B,EAAE,4BAA4B;gBAA1D,4BAA4B,EAAE,4BAA4B;aAEzE,GAAG,CACjB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAEH,2BAA2B,CACtC,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,OAAO,EACrB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,sBAAsB,EACxC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAuBjC,OAAO,CAAC,2BAA2B;IAInC,OAAO,CAAC,6BAA6B;IAOrC,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,2BAA2B;CASpC;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;IAC1C,GAAG,CACd,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IA2BhB,OAAO,CAAC,uBAAuB;CAUhC;AAED,qBAAa,mBAAoB,SAAQ,iBAAiB;IAGtD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAFjC,4BAA4B,EAAE,4BAA4B,EACzC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,sBAAsB;IAK9C,GAAG,CACd,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,+BAA+B,EACtC,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,IAAI,CAAC;IAqDH,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;YAKnD,qBAAqB;IAUnC,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gBAAgB;YAmBV,gBAAgB;CAO/B"}
@@ -81,120 +81,59 @@ class TunnelServiceBase {
81
81
  constructor(configFilePortFindingService) {
82
82
  this.configFilePortFindingService = configFilePortFindingService;
83
83
  }
84
- async getDockerOptions(tunnelOptions, debugEnabled, { email, token }) {
84
+ async getTunnelProcessEnvironment(tunnelOptions, debugEnabled, { email, token }, port, cspReporterPort, resourcePorts) {
85
+ var _a;
85
86
  try {
86
87
  const graphqlGateway = (0, cli_shared_1.getGraphqlGateway)();
87
88
  return [
88
- '--rm',
89
- `--name`,
90
- exports.CONTAINER_NAME,
91
- '--platform',
92
- 'linux/amd64',
93
- `--env`,
94
- `APP_FOLDER=/app`,
95
- `--env`,
96
- `FORGE_EMAIL=${email}`,
97
- `--env`,
98
- `FORGE_API_TOKEN=${token}`,
99
- `--env`,
100
- `ENVIRONMENT_KEY=${tunnelOptions.environment || 'default'}`,
101
- `--env`,
102
- `TUNNEL_INSPECTOR_ENABLED=${!!tunnelOptions.debug}`,
103
- `--env`,
104
- `FORGE_GRAPHQL_GATEWAY=${graphqlGateway}`,
105
- `--env`,
106
- `VERBOSE_MODE=${debugEnabled}`,
107
- `--env`,
108
- `CLI_DETAILS=${JSON.stringify(cliDetails)}`,
109
- `${exports.IMAGE_NAME}`
89
+ { key: 'APP_FOLDER', value: '/app' },
90
+ { key: 'FORGE_EMAIL', value: email },
91
+ { key: 'FORGE_API_TOKEN', value: token },
92
+ { key: 'ENVIRONMENT_KEY', value: (_a = tunnelOptions.environment) !== null && _a !== void 0 ? _a : 'default' },
93
+ { key: 'TUNNEL_INSPECTOR_ENABLED', value: (!!tunnelOptions.debug).toString() },
94
+ { key: 'FORGE_GRAPHQL_GATEWAY', value: graphqlGateway },
95
+ { key: 'VERBOSE_MODE', value: `${debugEnabled}` },
96
+ { key: 'CLI_DETAILS', value: JSON.stringify(cliDetails) },
97
+ ...this.getInspectorPortEnvironment(port),
98
+ ...this.getCspReporterPortEnvironment(cspReporterPort),
99
+ ...this.getResourcePortEnvironment(resourcePorts),
100
+ ...this.getUserEnvironmentVariables()
110
101
  ];
111
102
  }
112
103
  catch (e) {
113
104
  throw new HiddenDockerTunnelError(false, "Couldn't populate docker options for tunneling");
114
105
  }
115
106
  }
116
- getPortOptions(port, resourcePorts, cspReporterPort) {
117
- const resourcePortOptions = (0, cli_shared_1.flatMap)(Object.values(resourcePorts), (resourcePort) => [
118
- '-p',
119
- `${resourcePort}:${resourcePort}`
120
- ]);
121
- const cspReporterPortOption = cspReporterPort
122
- ? ['-p', `${cspReporterPort}:${cspReporterPort}`, '--env', `CSP_REPORTER_PORT=${cspReporterPort}`]
123
- : [];
124
- const addHostOption = os_1.default.platform() === 'linux' ? ['--add-host', 'host.docker.internal:host-gateway'] : [];
125
- return [
126
- `-p`,
127
- `${port}:${port}`,
128
- ...resourcePortOptions,
129
- ...addHostOption,
130
- ...cspReporterPortOption,
131
- `--env`,
132
- `TUNNEL_INSPECTOR_PORT=${port}`
133
- ];
107
+ getInspectorPortEnvironment(port) {
108
+ return [{ key: 'TUNNEL_INSPECTOR_PORT', value: port.toString() }];
109
+ }
110
+ getCspReporterPortEnvironment(cspReporterPort) {
111
+ if (cspReporterPort) {
112
+ return [{ key: 'CSP_REPORTER_PORT', value: cspReporterPort.toString() }];
113
+ }
114
+ return [];
134
115
  }
135
- getResourcePortEnvVarOption(resourcePorts) {
136
- return ['--env', `RESOURCE_PORT_MAP=${JSON.stringify(resourcePorts)}`];
116
+ getResourcePortEnvironment(resourcePorts) {
117
+ return [{ key: `RESOURCE_PORT_MAP`, value: JSON.stringify(resourcePorts) }];
137
118
  }
138
- getUserEnvironmentVariablesOptions() {
139
- const options = [];
119
+ getUserEnvironmentVariables() {
120
+ const vars = [];
140
121
  Object.keys(process.env)
141
122
  .filter((variable) => variable.startsWith('FORGE_USER_VAR_'))
142
123
  .forEach((name) => {
143
- options.push('--env', `${name}=${process.env[name]}`);
144
- });
145
- return options;
146
- }
147
- addEnvVarsForLocalTunnel(env) {
148
- return Object.assign(Object.assign({}, env), { PATH: process.env.PATH || '', FORCE_COLOR: '1' });
149
- }
150
- transformDockerOptionsToEnvVars(options) {
151
- const envVarRegex = new RegExp('^(\\w+)=(.+)$', 'g');
152
- const envVars = options.filter((opt) => envVarRegex.test(opt));
153
- const envVarObj = {};
154
- envVars.forEach((envVar) => {
155
- envVarRegex.lastIndex = 0;
156
- const [, key, val] = envVarRegex.exec(envVar);
157
- envVarObj[key] = val;
124
+ var _a;
125
+ vars.push({ key: name, value: (_a = process.env[name]) !== null && _a !== void 0 ? _a : 'undefined' });
158
126
  });
159
- return envVarObj;
160
- }
161
- getInteractiveOptions() {
162
- if (DISABLE_TTY) {
163
- return [`-i`];
164
- }
165
- return [`-it`];
166
- }
167
- getVolumeOptions() {
168
- const options = [`-v=${process.cwd()}:/app:cached`];
169
- if (process.env.FORGE_DEV_DOCKER_TUNNEL) {
170
- const monorepoRoot = (0, path_1.join)(__dirname, '../../../..');
171
- options.push(`-v=${monorepoRoot}:/monorepo:cached`);
172
- options.push(`-v=${monorepoRoot}/node_modules/ngrok/docker-bin:/monorepo/node_modules/ngrok/bin`);
173
- }
174
- if (process.env.FORGE_TUNNEL_MOUNT_DIRECTORIES) {
175
- const mounts = process.env.FORGE_TUNNEL_MOUNT_DIRECTORIES.split(',');
176
- mounts.forEach((mount) => {
177
- options.push(`-v=${mount}:cached`);
178
- });
179
- }
180
- return options;
127
+ return vars;
181
128
  }
182
129
  }
183
130
  class LocalTunnelService extends TunnelServiceBase {
184
131
  async run(tunnelOptions, creds, debugEnabled, onError) {
185
- const dockerOptions = await this.getDockerOptions(tunnelOptions, debugEnabled, creds);
186
132
  const port = await (0, portfinder_1.getPortPromise)();
187
133
  const resourcePorts = await this.configFilePortFindingService.findPorts();
188
134
  const cspReporterPort = await this.configFilePortFindingService.findPortAfter(Object.values(resourcePorts));
189
- const portOptions = this.getPortOptions(port, resourcePorts, cspReporterPort);
190
- const envVariablesOptions = this.getUserEnvironmentVariablesOptions();
191
- const resourcePortEnvVarOption = this.getResourcePortEnvVarOption(resourcePorts);
192
- const env = this.addEnvVarsForLocalTunnel(this.transformDockerOptionsToEnvVars([
193
- ...dockerOptions,
194
- ...portOptions,
195
- ...envVariablesOptions,
196
- ...resourcePortEnvVarOption
197
- ]));
135
+ const environment = await this.getTunnelProcessEnvironment(tunnelOptions, debugEnabled, creds, port, cspReporterPort, resourcePorts);
136
+ const env = this.formatEnvForLocalTunnel(environment);
198
137
  const process = (0, cross_spawn_1.spawn)('forge-tunnel', [], {
199
138
  stdio: 'inherit',
200
139
  env: Object.assign(Object.assign({}, env), { FORGE_DEV_TUNNEL: 'true' })
@@ -203,6 +142,12 @@ class LocalTunnelService extends TunnelServiceBase {
203
142
  process.on('error', onError);
204
143
  }
205
144
  }
145
+ formatEnvForLocalTunnel(environment) {
146
+ return Object.assign({}, {
147
+ PATH: process.env.PATH || '',
148
+ FORCE_COLOR: '1'
149
+ }, ...environment.map(({ key, value }) => ({ [key]: value })));
150
+ }
206
151
  }
207
152
  exports.LocalTunnelService = LocalTunnelService;
208
153
  class DockerTunnelService extends TunnelServiceBase {
@@ -214,22 +159,22 @@ class DockerTunnelService extends TunnelServiceBase {
214
159
  async run(tunnelOptions, creds, debugEnabled) {
215
160
  var _a;
216
161
  await this.validateDockerVersion(creds, debugEnabled);
217
- const dockerOptions = await this.getDockerOptions(tunnelOptions, debugEnabled, creds);
162
+ const dockerOptions = await this.getDockerOptions();
218
163
  const port = await (0, portfinder_1.getPortPromise)();
219
164
  const resourcePorts = await this.configFilePortFindingService.findPorts(port);
220
165
  const cspReporterPort = await this.configFilePortFindingService.findPortAfter(Object.values(resourcePorts));
221
- const portOptions = this.getPortOptions(port, resourcePorts, cspReporterPort);
166
+ const environment = await this.getTunnelProcessEnvironment(tunnelOptions, debugEnabled, creds, port, cspReporterPort, resourcePorts);
167
+ const portOptions = this.getDockerPortOptions(port, resourcePorts, cspReporterPort);
222
168
  const interactiveOptions = this.getInteractiveOptions();
223
169
  const volumeOptions = this.getVolumeOptions();
224
- const envVariablesOptions = this.getUserEnvironmentVariablesOptions();
225
- const resourcePortEnvVarOption = this.getResourcePortEnvVarOption(resourcePorts);
170
+ const env = this.formatEnvForDocker(environment);
226
171
  const docker = this.dockerService.runContainer([
227
172
  ...interactiveOptions,
228
173
  ...volumeOptions,
229
174
  ...portOptions,
230
- ...envVariablesOptions,
231
- ...resourcePortEnvVarOption,
232
- ...dockerOptions
175
+ ...dockerOptions,
176
+ ...env,
177
+ exports.IMAGE_NAME
233
178
  ]);
234
179
  docker.on('exit', () => this.analyticsService.reportTunnelClosed(creds));
235
180
  (_a = docker.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (error) => {
@@ -262,5 +207,49 @@ class DockerTunnelService extends TunnelServiceBase {
262
207
  throw new HiddenDockerTunnelError(true);
263
208
  }
264
209
  }
210
+ getDockerPortOptions(port, resourcePorts, cspReporterPort) {
211
+ const resourcePortOptions = (0, cli_shared_1.flatMap)(Object.values(resourcePorts), (resourcePort) => [
212
+ '-p',
213
+ `${resourcePort}:${resourcePort}`
214
+ ]);
215
+ const cspReporterPortOption = [];
216
+ if (cspReporterPort) {
217
+ cspReporterPortOption.push('-p', `${cspReporterPort}:${cspReporterPort}`);
218
+ }
219
+ const addHostOption = os_1.default.platform() === 'linux' ? ['--add-host', 'host.docker.internal:host-gateway'] : [];
220
+ return [`-p`, `${port}:${port}`, ...resourcePortOptions, ...addHostOption, ...cspReporterPortOption];
221
+ }
222
+ formatEnvForDocker(environment) {
223
+ return (0, cli_shared_1.flatMap)(environment, ({ key, value }) => ['--env', `${key}=${value}`]);
224
+ }
225
+ getInteractiveOptions() {
226
+ if (DISABLE_TTY) {
227
+ return [`-i`];
228
+ }
229
+ return [`-it`];
230
+ }
231
+ getVolumeOptions() {
232
+ const options = [`-v=${process.cwd()}:/app:cached`];
233
+ if (process.env.FORGE_DEV_DOCKER_TUNNEL) {
234
+ const monorepoRoot = (0, path_1.join)(__dirname, '../../../..');
235
+ options.push(`-v=${monorepoRoot}:/monorepo:cached`);
236
+ options.push(`-v=${monorepoRoot}/node_modules/ngrok/docker-bin:/monorepo/node_modules/ngrok/bin`);
237
+ }
238
+ if (process.env.FORGE_TUNNEL_MOUNT_DIRECTORIES) {
239
+ const mounts = process.env.FORGE_TUNNEL_MOUNT_DIRECTORIES.split(',');
240
+ mounts.forEach((mount) => {
241
+ options.push(`-v=${mount}:cached`);
242
+ });
243
+ }
244
+ return options;
245
+ }
246
+ async getDockerOptions() {
247
+ try {
248
+ return ['--rm', `--name`, exports.CONTAINER_NAME, '--platform', 'linux/amd64'];
249
+ }
250
+ catch (e) {
251
+ throw new HiddenDockerTunnelError(false, "Couldn't populate docker options for tunneling");
252
+ }
253
+ }
265
254
  }
266
255
  exports.DockerTunnelService = DockerTunnelService;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge/cli",
3
- "version": "6.17.0-next.29",
3
+ "version": "6.17.1-next.8",
4
4
  "description": "A command line interface for managing Atlassian-hosted apps",
5
5
  "author": "Atlassian",
6
6
  "license": "UNLICENSED",
@@ -18,20 +18,20 @@
18
18
  "postinstall": "node -e \"process.exitCode = fs.existsSync('./out/bin/postinstall.js')\" || node ./out/bin/postinstall.js"
19
19
  },
20
20
  "dependencies": {
21
- "@forge/bundler": "4.12.0-next.24",
22
- "@forge/cli-shared": "3.18.0-next.15",
23
- "@forge/egress": "1.2.4-next.3",
24
- "@forge/lint": "3.6.6-next.15",
25
- "@forge/manifest": "4.20.0-next.9",
26
- "@forge/node-runtime": "0.1.2-next.9",
27
- "@forge/runtime": "5.0.1-next.7",
28
- "@forge/tunnel": "3.7.0-next.25",
21
+ "@forge/bundler": "4.12.1-next.6",
22
+ "@forge/cli-shared": "3.18.1-next.4",
23
+ "@forge/egress": "1.2.5-next.0",
24
+ "@forge/lint": "3.6.7-next.4",
25
+ "@forge/manifest": "4.20.1-next.1",
26
+ "@forge/node-runtime": "0.1.3-next.0",
27
+ "@forge/runtime": "5.0.2-next.0",
28
+ "@forge/tunnel": "3.7.1-next.6",
29
29
  "@forge/util": "1.3.1",
30
- "@sentry/node": "^7.66.0",
30
+ "@sentry/node": "^7.68.0",
31
31
  "ajv": "^8.12.0",
32
32
  "archiver": "^6.0.1",
33
33
  "case": "^1.6.3",
34
- "chalk": "^2.4.2",
34
+ "chalk": "^4.1.2",
35
35
  "cheerio": "^0.22.0",
36
36
  "cli-table3": "^0.6.3",
37
37
  "command-exists": "^1.2.9",
@@ -40,7 +40,7 @@
40
40
  "dayjs": "^1.11.9",
41
41
  "didyoumean": "^1.2.2",
42
42
  "env-paths": "^2.2.1",
43
- "form-data": "^3.0.1",
43
+ "form-data": "^4.0.0",
44
44
  "fs-extra": "^8.1.0",
45
45
  "hidefile": "^3.0.0",
46
46
  "latest-version": "^6.0.0",
@@ -70,7 +70,7 @@
70
70
  "@types/js-yaml": "^3.12.7",
71
71
  "@types/minimatch": "^3.0.5",
72
72
  "@types/mkdirp": "^1.0.2",
73
- "@types/node": "14.18.58",
73
+ "@types/node": "14.18.59",
74
74
  "@types/node-fetch": "^2.6.4",
75
75
  "@types/omelette": "^0.4.2",
76
76
  "@types/semver": "^7.5.1",