@forge/cli-shared 8.15.0 → 8.15.1-experimental-1ee2de3
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.
- package/CHANGELOG.md +129 -0
- package/out/config/config-file.d.ts.map +1 -1
- package/out/config/config-file.js +6 -18
- package/out/graphql/graphql-types.d.ts +10252 -449
- package/out/graphql/graphql-types.d.ts.map +1 -1
- package/out/graphql/graphql-types.js +1158 -67
- package/out/service/statsig-service.d.ts.map +1 -1
- package/out/service/statsig-service.js +6 -2
- package/out/tunnel/docker-compose-lifecycle.d.ts +14 -2
- package/out/tunnel/docker-compose-lifecycle.d.ts.map +1 -1
- package/out/tunnel/docker-compose-lifecycle.js +232 -23
- package/out/tunnel/tunnel-options.d.ts +2 -0
- package/out/tunnel/tunnel-options.d.ts.map +1 -1
- package/out/tunnel/tunnel-options.js +3 -1
- package/out/ui/text.d.ts +6 -0
- package/out/ui/text.d.ts.map +1 -1
- package/out/ui/text.js +11 -5
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statsig-service.d.ts","sourceRoot":"","sources":["../../src/service/statsig-service.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EAEpB,MAAM,
|
|
1
|
+
{"version":3,"file":"statsig-service.d.ts","sourceRoot":"","sources":["../../src/service/statsig-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -192,7 +192,9 @@ class StatsigService extends StatsigReader {
|
|
|
192
192
|
return gates[gate] ?? null;
|
|
193
193
|
}
|
|
194
194
|
catch (error) {
|
|
195
|
-
this.logger.
|
|
195
|
+
if (this.logger.traceEnabled) {
|
|
196
|
+
this.logger.warn(index_1.Text.warning.statsigFetchFailed('feature gates'));
|
|
197
|
+
}
|
|
196
198
|
return null;
|
|
197
199
|
}
|
|
198
200
|
}
|
|
@@ -202,7 +204,9 @@ class StatsigService extends StatsigReader {
|
|
|
202
204
|
return dynamicConfigs[dynamicConfig].value ?? null;
|
|
203
205
|
}
|
|
204
206
|
catch (error) {
|
|
205
|
-
this.logger.
|
|
207
|
+
if (this.logger.traceEnabled) {
|
|
208
|
+
this.logger.warn(index_1.Text.warning.statsigFetchFailed('dynamic configurations'));
|
|
209
|
+
}
|
|
206
210
|
return null;
|
|
207
211
|
}
|
|
208
212
|
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { UserError } from '../shared';
|
|
2
2
|
import { ConfigFile } from '../config/config-file';
|
|
3
|
+
import { Logger } from '../ui/logger';
|
|
3
4
|
import { Services } from '@forge/manifest';
|
|
5
|
+
import { ChildProcess } from 'child_process';
|
|
4
6
|
export declare const PROXY_SIDECAR_VOLUME_DIR = "/forge/container";
|
|
5
7
|
export declare const CONTAINER_SERVICE_ASSETS = ".container-service-assets";
|
|
6
8
|
export declare const K8S_AUTH_TOKEN_FILENAME = "local-account";
|
|
9
|
+
export declare const STARTUP_TIMER_MS: number;
|
|
10
|
+
export declare const STARTUP_TIMER_BUFFER_MS: number;
|
|
7
11
|
export declare class InvalidContainerServicePort extends UserError {
|
|
8
12
|
constructor(serviceKey: string);
|
|
9
13
|
}
|
|
@@ -13,14 +17,22 @@ export declare class DockerUnableToPullProxySidecarImage extends UserError {
|
|
|
13
17
|
export declare class DockerUnableToStartError extends UserError {
|
|
14
18
|
constructor(err?: Error);
|
|
15
19
|
}
|
|
20
|
+
export declare class UnableToParseDockerComposeFileError extends UserError {
|
|
21
|
+
constructor(serviceKey: string, err?: Error);
|
|
22
|
+
}
|
|
16
23
|
export declare class MissingImageOrBuildContextError extends UserError {
|
|
17
24
|
constructor(containerKey: string);
|
|
18
25
|
}
|
|
19
26
|
export declare class CannotUseBothImageAndBuildContextError extends UserError {
|
|
20
27
|
constructor(containerKey: string);
|
|
21
28
|
}
|
|
29
|
+
export declare class DockerAuthenticationError extends UserError {
|
|
30
|
+
constructor(errCode: string);
|
|
31
|
+
}
|
|
22
32
|
export declare const generateContainersDockerComposeFile: (services: Services, appId: string, envId: string) => Promise<Record<string, string>>;
|
|
23
33
|
export declare const deleteDockerComposeFile: (composeFile: string) => Promise<void>;
|
|
24
|
-
export declare const startDockerComposeStack: (dockerComposeFilePath: string, serviceKey: string) => Promise<void>;
|
|
25
|
-
export declare const
|
|
34
|
+
export declare const startDockerComposeStack: (dockerComposeFilePath: string, serviceKey: string, logger: Logger) => Promise<void>;
|
|
35
|
+
export declare const determineComposeFlags: (dockerComposeFilePath: string, serviceKey: string, logger: Logger) => Promise<string[]>;
|
|
36
|
+
export declare const stopDockerComposeStack: (configFile: ConfigFile, logger: Logger, composeFiles?: Record<string, string>) => Promise<void>;
|
|
37
|
+
export declare const processDockerAuthentication: (childProcess: ChildProcess) => Promise<void>;
|
|
26
38
|
//# sourceMappingURL=docker-compose-lifecycle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker-compose-lifecycle.d.ts","sourceRoot":"","sources":["../../src/tunnel/docker-compose-lifecycle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"docker-compose-lifecycle.d.ts","sourceRoot":"","sources":["../../src/tunnel/docker-compose-lifecycle.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAO3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AACpE,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AAYvD,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAC1C,eAAO,MAAM,uBAAuB,QAAW,CAAC;AAEhD,qBAAa,2BAA4B,SAAQ,SAAS;gBAC5C,UAAU,EAAE,MAAM;CAG/B;AAED,qBAAa,mCAAoC,SAAQ,SAAS;gBACpD,GAAG,CAAC,EAAE,KAAK;CAGxB;AAED,qBAAa,wBAAyB,SAAQ,SAAS;gBACzC,GAAG,CAAC,EAAE,KAAK;CAGxB;AAED,qBAAa,mCAAoC,SAAQ,SAAS;gBACpD,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK;CAG5C;AAED,qBAAa,+BAAgC,SAAQ,SAAS;gBAChD,YAAY,EAAE,MAAM;CAGjC;AAED,qBAAa,sCAAuC,SAAQ,SAAS;gBACvD,YAAY,EAAE,MAAM;CAGjC;AAED,qBAAa,yBAA0B,SAAQ,SAAS;gBAC1C,OAAO,EAAE,MAAM;CAG5B;AAMD,eAAO,MAAM,mCAAmC,8BAAqC,MAAM,SAAS,MAAM,oCAgFzG,CAAC;AAuFF,eAAO,MAAM,uBAAuB,gBAAuB,MAAM,kBAYhE,CAAC;AAOF,eAAO,MAAM,uBAAuB,0BAAiC,MAAM,cAAc,MAAM,UAAU,MAAM,kBAc9G,CAAC;AAOF,eAAO,MAAM,qBAAqB,0BACT,MAAM,cACjB,MAAM,UACV,MAAM,KACb,QAAQ,MAAM,EAAE,CAgBlB,CAAC;AA2LF,eAAO,MAAM,sBAAsB,eACrB,UAAU,UACd,MAAM,iBACC,OAAO,MAAM,EAAE,MAAM,CAAC,kBAmCtC,CAAC;AAgCF,eAAO,MAAM,2BAA2B,iBAAwB,YAAY,kBAW3E,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.stopDockerComposeStack = exports.startDockerComposeStack = exports.deleteDockerComposeFile = exports.generateContainersDockerComposeFile = exports.CannotUseBothImageAndBuildContextError = exports.MissingImageOrBuildContextError = exports.DockerUnableToStartError = exports.DockerUnableToPullProxySidecarImage = exports.InvalidContainerServicePort = exports.K8S_AUTH_TOKEN_FILENAME = exports.CONTAINER_SERVICE_ASSETS = exports.PROXY_SIDECAR_VOLUME_DIR = void 0;
|
|
3
|
+
exports.processDockerAuthentication = exports.stopDockerComposeStack = exports.determineComposeFlags = exports.startDockerComposeStack = exports.deleteDockerComposeFile = exports.generateContainersDockerComposeFile = exports.DockerAuthenticationError = exports.CannotUseBothImageAndBuildContextError = exports.MissingImageOrBuildContextError = exports.UnableToParseDockerComposeFileError = exports.DockerUnableToStartError = exports.DockerUnableToPullProxySidecarImage = exports.InvalidContainerServicePort = exports.STARTUP_TIMER_BUFFER_MS = exports.STARTUP_TIMER_MS = exports.K8S_AUTH_TOKEN_FILENAME = exports.CONTAINER_SERVICE_ASSETS = exports.PROXY_SIDECAR_VOLUME_DIR = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const fs = tslib_1.__importStar(require("fs"));
|
|
6
6
|
const path = tslib_1.__importStar(require("path"));
|
|
7
7
|
const yaml = tslib_1.__importStar(require("yaml"));
|
|
8
|
+
const http = tslib_1.__importStar(require("http"));
|
|
8
9
|
const docker_compose_1 = require("docker-compose");
|
|
9
10
|
const shared_1 = require("../shared");
|
|
10
11
|
const text_1 = require("../ui/text");
|
|
@@ -14,6 +15,14 @@ exports.PROXY_SIDECAR_VOLUME_DIR = '/forge/container';
|
|
|
14
15
|
exports.CONTAINER_SERVICE_ASSETS = '.container-service-assets';
|
|
15
16
|
exports.K8S_AUTH_TOKEN_FILENAME = 'local-account';
|
|
16
17
|
const PROXY_SIDECAR_SERVICE_NAME = 'proxy-sidecar';
|
|
18
|
+
const LIFECYCLE_PATTERNS = [
|
|
19
|
+
/Container .* (Starting|Started|Stopping|Stopped|Creating|Created|Recreated)/,
|
|
20
|
+
/Network .* (Creating|Created|Removing|Removed)/,
|
|
21
|
+
/Volume .* (Creating|Created|Removing|Removed)/,
|
|
22
|
+
/\[[\+\-]\] Running/
|
|
23
|
+
];
|
|
24
|
+
exports.STARTUP_TIMER_MS = 30 * 1000;
|
|
25
|
+
exports.STARTUP_TIMER_BUFFER_MS = 5 * 1000;
|
|
17
26
|
class InvalidContainerServicePort extends shared_1.UserError {
|
|
18
27
|
constructor(serviceKey) {
|
|
19
28
|
super(text_1.Text.error.invalidServicePort(serviceKey));
|
|
@@ -32,6 +41,12 @@ class DockerUnableToStartError extends shared_1.UserError {
|
|
|
32
41
|
}
|
|
33
42
|
}
|
|
34
43
|
exports.DockerUnableToStartError = DockerUnableToStartError;
|
|
44
|
+
class UnableToParseDockerComposeFileError extends shared_1.UserError {
|
|
45
|
+
constructor(serviceKey, err) {
|
|
46
|
+
super(text_1.Text.tunnel.UnableToParseDockerComposeFileError(serviceKey, err?.message ?? 'Unknown Error Occurred.'));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.UnableToParseDockerComposeFileError = UnableToParseDockerComposeFileError;
|
|
35
50
|
class MissingImageOrBuildContextError extends shared_1.UserError {
|
|
36
51
|
constructor(containerKey) {
|
|
37
52
|
super(text_1.Text.tunnel.missingImageOrBuildContext(containerKey));
|
|
@@ -44,9 +59,15 @@ class CannotUseBothImageAndBuildContextError extends shared_1.UserError {
|
|
|
44
59
|
}
|
|
45
60
|
}
|
|
46
61
|
exports.CannotUseBothImageAndBuildContextError = CannotUseBothImageAndBuildContextError;
|
|
62
|
+
class DockerAuthenticationError extends shared_1.UserError {
|
|
63
|
+
constructor(errCode) {
|
|
64
|
+
super(text_1.Text.tunnel.unableToAuthenticateDocker(errCode));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.DockerAuthenticationError = DockerAuthenticationError;
|
|
47
68
|
const generateContainersDockerComposeFile = async (services, appId, envId) => {
|
|
48
69
|
const filesGenerated = {};
|
|
49
|
-
for (const service of services) {
|
|
70
|
+
for (const [serviceIndex, service] of services.entries()) {
|
|
50
71
|
const { key: serviceKey, containers } = service;
|
|
51
72
|
const containersWithTunnelConfig = containers.filter((container) => !!container.tunnel);
|
|
52
73
|
if (containersWithTunnelConfig.length > 0) {
|
|
@@ -66,12 +87,17 @@ const generateContainersDockerComposeFile = async (services, appId, envId) => {
|
|
|
66
87
|
...container.tunnel?.docker,
|
|
67
88
|
depends_on: [PROXY_SIDECAR_SERVICE_NAME]
|
|
68
89
|
};
|
|
69
|
-
if (config.build?.context
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
if (config.build?.context) {
|
|
91
|
+
config.build.context = adjustFilePath(config.build.context);
|
|
92
|
+
}
|
|
93
|
+
if (config.volumes) {
|
|
94
|
+
config.volumes = config.volumes.map((volume) => adjustFilePath(volume));
|
|
95
|
+
}
|
|
96
|
+
if (config.develop?.watch) {
|
|
97
|
+
config.develop.watch = config.develop.watch.map((watchConfig) => ({
|
|
98
|
+
...watchConfig,
|
|
99
|
+
path: adjustFilePath(watchConfig.path)
|
|
100
|
+
}));
|
|
75
101
|
}
|
|
76
102
|
const envArray = container?.tunnel?.docker.environment ?? [];
|
|
77
103
|
const filteredEnvArray = envArray.filter((envVar) => !envVar.startsWith('FORGE_EGRESS_PROXY_URL='));
|
|
@@ -79,10 +105,11 @@ const generateContainersDockerComposeFile = async (services, appId, envId) => {
|
|
|
79
105
|
config.environment = filteredEnvArray;
|
|
80
106
|
return [container.key, config];
|
|
81
107
|
}));
|
|
108
|
+
const healthEndpointPath = containersWithTunnelConfig[0].health.route.path;
|
|
82
109
|
const dockerComposeConfig = {
|
|
83
110
|
services: {
|
|
84
111
|
...containerConfig,
|
|
85
|
-
...(await getProxySidecarConfig(serviceKey, Object.keys(containerConfig), port, appId, envId))
|
|
112
|
+
...(await getProxySidecarConfig(serviceKey, Object.keys(containerConfig), port, appId, envId, serviceIndex, healthEndpointPath))
|
|
86
113
|
}
|
|
87
114
|
};
|
|
88
115
|
const yamlString = yaml.stringify(dockerComposeConfig);
|
|
@@ -94,7 +121,17 @@ const generateContainersDockerComposeFile = async (services, appId, envId) => {
|
|
|
94
121
|
return filesGenerated;
|
|
95
122
|
};
|
|
96
123
|
exports.generateContainersDockerComposeFile = generateContainersDockerComposeFile;
|
|
97
|
-
const
|
|
124
|
+
const adjustFilePath = (filePath) => {
|
|
125
|
+
if (path.isAbsolute(filePath)) {
|
|
126
|
+
return filePath;
|
|
127
|
+
}
|
|
128
|
+
let adjusted = filePath;
|
|
129
|
+
if (adjusted.startsWith('./')) {
|
|
130
|
+
adjusted = adjusted.slice(2);
|
|
131
|
+
}
|
|
132
|
+
return path.join('..', adjusted);
|
|
133
|
+
};
|
|
134
|
+
const getProxySidecarConfig = async (serviceKey, containerKeys, port, appId, envId, serviceIndex, healthEndpointPath) => {
|
|
98
135
|
let fopBaseUrl = 'https://forge-outbound-proxy.services.atlassian.com';
|
|
99
136
|
let jwksUrl = 'https://forge.cdn.prod.atlassian-dev.net/.well-known/jwks.json';
|
|
100
137
|
let proxySidecarImage = 'forge-ecr.services.atlassian.com/forge-platform/proxy-sidecar:latest';
|
|
@@ -118,10 +155,14 @@ const getProxySidecarConfig = async (serviceKey, containerKeys, port, appId, env
|
|
|
118
155
|
`ENV_ID=ari:cloud:ecosystem::environment/${appIdShort}/${envId}`,
|
|
119
156
|
`JWKS_URL=${jwksUrl}`,
|
|
120
157
|
`IS_LOCAL_DEV=true`,
|
|
121
|
-
`K8S_AUTH_TOKEN_PATH=${exports.PROXY_SIDECAR_VOLUME_DIR}/${exports.K8S_AUTH_TOKEN_FILENAME}
|
|
158
|
+
`K8S_AUTH_TOKEN_PATH=${exports.PROXY_SIDECAR_VOLUME_DIR}/${exports.K8S_AUTH_TOKEN_FILENAME}`,
|
|
159
|
+
`${containerKeys[0]}_CONTAINER_HEALTHCHECK=http://${containerKeys[0]}:8080${healthEndpointPath}`
|
|
122
160
|
],
|
|
123
161
|
volumes: [`../${exports.CONTAINER_SERVICE_ASSETS}:${exports.PROXY_SIDECAR_VOLUME_DIR}:ro`],
|
|
124
|
-
ports: [
|
|
162
|
+
ports: [
|
|
163
|
+
`${port}:${tunnel_options_1.DEFAULT_PROXY_INGRESS_PORT}`,
|
|
164
|
+
`${tunnel_options_1.DEFAULT_PROXY_HEALTHCHECK_PORT_HOST_MACHINE + serviceIndex}:${tunnel_options_1.DEFAULT_PROXY_HEALTHCHECK_PORT}`
|
|
165
|
+
]
|
|
125
166
|
}
|
|
126
167
|
};
|
|
127
168
|
};
|
|
@@ -148,7 +189,7 @@ const deleteDockerComposeFile = async (composeFile) => {
|
|
|
148
189
|
}
|
|
149
190
|
};
|
|
150
191
|
exports.deleteDockerComposeFile = deleteDockerComposeFile;
|
|
151
|
-
const startDockerComposeStack = async (dockerComposeFilePath, serviceKey) => {
|
|
192
|
+
const startDockerComposeStack = async (dockerComposeFilePath, serviceKey, logger) => {
|
|
152
193
|
try {
|
|
153
194
|
await (0, docker_compose_1.pullOne)('proxy-sidecar', {
|
|
154
195
|
cwd: path.dirname(dockerComposeFilePath),
|
|
@@ -159,21 +200,154 @@ const startDockerComposeStack = async (dockerComposeFilePath, serviceKey) => {
|
|
|
159
200
|
catch (err) {
|
|
160
201
|
throw new DockerUnableToPullProxySidecarImage(err);
|
|
161
202
|
}
|
|
203
|
+
await waitForContainersToStart(dockerComposeFilePath, serviceKey, logger);
|
|
204
|
+
};
|
|
205
|
+
exports.startDockerComposeStack = startDockerComposeStack;
|
|
206
|
+
const determineComposeFlags = async (dockerComposeFilePath, serviceKey, logger) => {
|
|
207
|
+
const flags = ['--build', '--quiet-pull'];
|
|
162
208
|
try {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
config
|
|
167
|
-
|
|
168
|
-
|
|
209
|
+
const composeConfig = getComposeConfig(dockerComposeFilePath);
|
|
210
|
+
const hasWatchConfig = Object.values(composeConfig?.services ?? {}).some((service) => service?.develop?.watch);
|
|
211
|
+
if (hasWatchConfig) {
|
|
212
|
+
logger.info(`Hot reload config detected. Starting up ${serviceKey} containers using the --watch flag.`);
|
|
213
|
+
flags.push('--watch');
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (_) { }
|
|
217
|
+
return flags;
|
|
218
|
+
};
|
|
219
|
+
exports.determineComposeFlags = determineComposeFlags;
|
|
220
|
+
const getComposeConfig = (dockerComposeFilePath) => {
|
|
221
|
+
try {
|
|
222
|
+
const composeContent = fs.readFileSync(dockerComposeFilePath, 'utf8');
|
|
223
|
+
const composeConfig = yaml.parse(composeContent);
|
|
224
|
+
return composeConfig;
|
|
225
|
+
}
|
|
226
|
+
catch (_) { }
|
|
227
|
+
return undefined;
|
|
228
|
+
};
|
|
229
|
+
const extractProxySidecarHealthcheckUrl = (composeConfig) => {
|
|
230
|
+
if (!composeConfig?.services) {
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
let healthCheckHostPort = undefined;
|
|
234
|
+
try {
|
|
235
|
+
const proxySidecarService = composeConfig.services[PROXY_SIDECAR_SERVICE_NAME];
|
|
236
|
+
if (proxySidecarService && proxySidecarService.ports && proxySidecarService.ports.length > 0) {
|
|
237
|
+
const portMapping = proxySidecarService.ports.find((portMapping) => {
|
|
238
|
+
const parts = portMapping.split(':');
|
|
239
|
+
return parts[1] === tunnel_options_1.DEFAULT_PROXY_HEALTHCHECK_PORT.toString();
|
|
240
|
+
});
|
|
241
|
+
if (portMapping) {
|
|
242
|
+
healthCheckHostPort = portMapping.split(':')[0];
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (_) { }
|
|
247
|
+
if (healthCheckHostPort) {
|
|
248
|
+
return `http://localhost:${healthCheckHostPort}/health`;
|
|
249
|
+
}
|
|
250
|
+
return undefined;
|
|
251
|
+
};
|
|
252
|
+
const checkContainerHealth = async (url) => {
|
|
253
|
+
return new Promise((resolve) => {
|
|
254
|
+
const request = http.get(url, { timeout: 3000 }, (res) => {
|
|
255
|
+
resolve((res.statusCode ?? 0) >= 200 && (res.statusCode ?? 0) < 300);
|
|
169
256
|
});
|
|
257
|
+
request.on('error', () => {
|
|
258
|
+
resolve(false);
|
|
259
|
+
});
|
|
260
|
+
request.on('timeout', () => {
|
|
261
|
+
request.destroy();
|
|
262
|
+
resolve(false);
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
const pollContainerHealth = async (proxySidecarHealthEndpointUrl, logger) => {
|
|
267
|
+
const maxAttempts = exports.STARTUP_TIMER_MS / 1000 - exports.STARTUP_TIMER_BUFFER_MS / 1000;
|
|
268
|
+
const pollInterval = 1000;
|
|
269
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
270
|
+
const isHealthy = await checkContainerHealth(proxySidecarHealthEndpointUrl);
|
|
271
|
+
if (isHealthy) {
|
|
272
|
+
logger.info('All health endpoints responded successfully!');
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
if (attempt === maxAttempts) {
|
|
276
|
+
logger.warn(`Containers did not become healthy within ${exports.STARTUP_TIMER_MS / 1000}s`);
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
280
|
+
}
|
|
281
|
+
return false;
|
|
282
|
+
};
|
|
283
|
+
const waitForContainersToStart = async (dockerComposeFilePath, serviceKey, logger) => {
|
|
284
|
+
const composeFlags = await (0, exports.determineComposeFlags)(dockerComposeFilePath, serviceKey, logger);
|
|
285
|
+
let proxySidecarHealthEndpointUrl;
|
|
286
|
+
try {
|
|
287
|
+
const composeConfig = getComposeConfig(dockerComposeFilePath);
|
|
288
|
+
proxySidecarHealthEndpointUrl = extractProxySidecarHealthcheckUrl(composeConfig);
|
|
170
289
|
}
|
|
171
290
|
catch (err) {
|
|
172
|
-
throw new
|
|
291
|
+
throw new UnableToParseDockerComposeFileError(serviceKey, err);
|
|
173
292
|
}
|
|
293
|
+
return new Promise((resolve, reject) => {
|
|
294
|
+
let containersStarted = false;
|
|
295
|
+
const startupTimer = setTimeout(() => {
|
|
296
|
+
if (!containersStarted) {
|
|
297
|
+
containersStarted = true;
|
|
298
|
+
logger.info(`Startup timeout reached (${exports.STARTUP_TIMER_MS / 1000}s). Starting up the forge tunnel...`);
|
|
299
|
+
resolve();
|
|
300
|
+
}
|
|
301
|
+
}, exports.STARTUP_TIMER_MS);
|
|
302
|
+
const logFilter = (chunk) => {
|
|
303
|
+
const output = chunk.toString();
|
|
304
|
+
const lines = output.split('\n');
|
|
305
|
+
lines.forEach((line) => {
|
|
306
|
+
if (!line.trim())
|
|
307
|
+
return;
|
|
308
|
+
if (LIFECYCLE_PATTERNS.some((pattern) => pattern.test(line))) {
|
|
309
|
+
logger.info(line);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
};
|
|
313
|
+
(0, docker_compose_1.execCompose)('up', composeFlags, {
|
|
314
|
+
cwd: path.dirname(dockerComposeFilePath),
|
|
315
|
+
log: false,
|
|
316
|
+
config: dockerComposeFilePath,
|
|
317
|
+
composeOptions: [`-p${serviceKey}`],
|
|
318
|
+
callback: logFilter
|
|
319
|
+
}).catch((error) => {
|
|
320
|
+
clearTimeout(startupTimer);
|
|
321
|
+
const errorMessage = error?.err || error?.out || error?.message || 'Unknown Error Occurred.';
|
|
322
|
+
reject(new DockerUnableToStartError(new Error(errorMessage)));
|
|
323
|
+
});
|
|
324
|
+
setTimeout(async () => {
|
|
325
|
+
if (containersStarted)
|
|
326
|
+
return;
|
|
327
|
+
try {
|
|
328
|
+
if (proxySidecarHealthEndpointUrl) {
|
|
329
|
+
logger.info(`Polling health endpoints for service: ${serviceKey}`);
|
|
330
|
+
const allHealthy = await pollContainerHealth(proxySidecarHealthEndpointUrl, logger);
|
|
331
|
+
if (allHealthy && !containersStarted) {
|
|
332
|
+
containersStarted = true;
|
|
333
|
+
clearTimeout(startupTimer);
|
|
334
|
+
resolve();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
logger.info('No health check endpoints found. Continuing with tunnel startup...');
|
|
339
|
+
containersStarted = true;
|
|
340
|
+
clearTimeout(startupTimer);
|
|
341
|
+
resolve();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
logger.warn(`Health check polling failed: ${err.message}. Relying on startup timeout...`);
|
|
346
|
+
}
|
|
347
|
+
}, exports.STARTUP_TIMER_BUFFER_MS);
|
|
348
|
+
});
|
|
174
349
|
};
|
|
175
|
-
|
|
176
|
-
const stopDockerComposeStack = async (configFile, composeFiles) => {
|
|
350
|
+
const stopDockerComposeStack = async (configFile, logger, composeFiles) => {
|
|
177
351
|
if (!composeFiles || Object.keys(composeFiles).length === 0)
|
|
178
352
|
return;
|
|
179
353
|
const { services } = await configFile.readConfig();
|
|
@@ -184,7 +358,13 @@ const stopDockerComposeStack = async (configFile, composeFiles) => {
|
|
|
184
358
|
return;
|
|
185
359
|
await Promise.all(Object.entries(composeFiles).map(async ([serviceKey, file]) => {
|
|
186
360
|
try {
|
|
187
|
-
await (0, docker_compose_1.downAll)({
|
|
361
|
+
await (0, docker_compose_1.downAll)({
|
|
362
|
+
cwd: '.',
|
|
363
|
+
log: false,
|
|
364
|
+
config: file,
|
|
365
|
+
composeOptions: [`-p${serviceKey}`],
|
|
366
|
+
callback: createCustomLogFilter(logger)
|
|
367
|
+
});
|
|
188
368
|
await (0, exports.deleteDockerComposeFile)(file);
|
|
189
369
|
}
|
|
190
370
|
catch (err) {
|
|
@@ -194,6 +374,35 @@ const stopDockerComposeStack = async (configFile, composeFiles) => {
|
|
|
194
374
|
deleteContainerServiceAssetsDir();
|
|
195
375
|
};
|
|
196
376
|
exports.stopDockerComposeStack = stopDockerComposeStack;
|
|
377
|
+
const createCustomLogFilter = (logger) => {
|
|
378
|
+
let buffer = '';
|
|
379
|
+
return (chunk) => {
|
|
380
|
+
buffer += chunk.toString();
|
|
381
|
+
const lines = buffer.split('\n');
|
|
382
|
+
buffer = lines.pop() || '';
|
|
383
|
+
lines.forEach((line) => {
|
|
384
|
+
if (!line.trim())
|
|
385
|
+
return;
|
|
386
|
+
if (LIFECYCLE_PATTERNS.some((pattern) => pattern.test(line))) {
|
|
387
|
+
logger.info(line);
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
};
|
|
391
|
+
};
|
|
392
|
+
const processDockerAuthentication = async (childProcess) => {
|
|
393
|
+
await new Promise((resolve, reject) => {
|
|
394
|
+
childProcess.on('close', (code) => {
|
|
395
|
+
if (code === 0) {
|
|
396
|
+
resolve();
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
reject(new DockerAuthenticationError(code?.toString() || 'unknown'));
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
childProcess.on('error', reject);
|
|
403
|
+
});
|
|
404
|
+
};
|
|
405
|
+
exports.processDockerAuthentication = processDockerAuthentication;
|
|
197
406
|
const deleteContainerServiceAssetsDir = () => {
|
|
198
407
|
const dirPath = path.join(process.cwd(), exports.CONTAINER_SERVICE_ASSETS);
|
|
199
408
|
if (fs.existsSync(dirPath)) {
|
|
@@ -17,5 +17,7 @@ export declare const defaultDebugStartingPort = 9229;
|
|
|
17
17
|
export declare const TUNNEL_BUNDLE_DIRECTORY: string;
|
|
18
18
|
export declare const defaultNoDebugTunnelOptions: TunnelOptions;
|
|
19
19
|
export declare const DEFAULT_PROXY_INGRESS_PORT = 7071;
|
|
20
|
+
export declare const DEFAULT_PROXY_HEALTHCHECK_PORT = 7073;
|
|
21
|
+
export declare const DEFAULT_PROXY_HEALTHCHECK_PORT_HOST_MACHINE = 7011;
|
|
20
22
|
export declare function getServicePort(services?: Services, serviceKey?: string): Promise<number | undefined>;
|
|
21
23
|
//# sourceMappingURL=tunnel-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-options.d.ts","sourceRoot":"","sources":["../../src/tunnel/tunnel-options.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,oBAAY,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,oBAAY,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,GAAG;IAC5E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,uBAAuB,QAA8C,CAAC;AACnF,eAAO,MAAM,2BAA2B,EAAE,aAGzC,CAAC;AAEF,eAAO,MAAM,0BAA0B,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel-options.d.ts","sourceRoot":"","sources":["../../src/tunnel/tunnel-options.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,oBAAY,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,oBAAY,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,GAAG;IAC5E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,uBAAuB,QAA8C,CAAC;AACnF,eAAO,MAAM,2BAA2B,EAAE,aAGzC,CAAC;AAEF,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,8BAA8B,OAAO,CAAC;AACnD,eAAO,MAAM,2CAA2C,OAAO,CAAC;AAQhE,wBAAsB,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ1G"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getServicePort = exports.DEFAULT_PROXY_INGRESS_PORT = exports.defaultNoDebugTunnelOptions = exports.TUNNEL_BUNDLE_DIRECTORY = exports.defaultDebugStartingPort = void 0;
|
|
3
|
+
exports.getServicePort = exports.DEFAULT_PROXY_HEALTHCHECK_PORT_HOST_MACHINE = exports.DEFAULT_PROXY_HEALTHCHECK_PORT = exports.DEFAULT_PROXY_INGRESS_PORT = exports.defaultNoDebugTunnelOptions = exports.TUNNEL_BUNDLE_DIRECTORY = exports.defaultDebugStartingPort = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const path_1 = tslib_1.__importDefault(require("path"));
|
|
6
6
|
const shared_1 = require("../shared");
|
|
@@ -11,6 +11,8 @@ exports.defaultNoDebugTunnelOptions = {
|
|
|
11
11
|
debugStartingPort: exports.defaultDebugStartingPort
|
|
12
12
|
};
|
|
13
13
|
exports.DEFAULT_PROXY_INGRESS_PORT = 7071;
|
|
14
|
+
exports.DEFAULT_PROXY_HEALTHCHECK_PORT = 7073;
|
|
15
|
+
exports.DEFAULT_PROXY_HEALTHCHECK_PORT_HOST_MACHINE = 7011;
|
|
14
16
|
async function getServicePort(services, serviceKey) {
|
|
15
17
|
if (!serviceKey || !services || services.length === 0)
|
|
16
18
|
return undefined;
|
package/out/ui/text.d.ts
CHANGED
|
@@ -71,6 +71,7 @@ export declare const Text: {
|
|
|
71
71
|
uikit: (modules: string[]) => string;
|
|
72
72
|
};
|
|
73
73
|
oldCreateCommandDeprecation: string;
|
|
74
|
+
statsigFetchFailed: (type: string) => string;
|
|
74
75
|
};
|
|
75
76
|
maxSizeOfUsersWithAccess: number;
|
|
76
77
|
installationContext: {
|
|
@@ -832,12 +833,15 @@ export declare const Text: {
|
|
|
832
833
|
stoppingTunnel: string;
|
|
833
834
|
stoppedTunnel: string;
|
|
834
835
|
tunnelStatusChange: (status: string) => string;
|
|
836
|
+
authenticatingDocker: string;
|
|
837
|
+
startingContainerService: (serviceKey: string) => string;
|
|
835
838
|
functionHandlersMustBeDefined: string;
|
|
836
839
|
debugArgumentNameMismatch: (arg: string) => string;
|
|
837
840
|
invalidDebugStartingPortNumber: (port: string) => string;
|
|
838
841
|
unableToAuthenticateDocker: (errCode: string) => string;
|
|
839
842
|
unableToPullProxySidecarImage: (errMessage: string) => string;
|
|
840
843
|
unableToStartDockerComposeStack: (errMessage: string) => string;
|
|
844
|
+
UnableToParseDockerComposeFileError: (serviceKey: string, errMessage: string) => string;
|
|
841
845
|
unableToStopDockerComposeStack: (serviceKey: string, errMessage: string) => string;
|
|
842
846
|
missingImageOrBuildContext: (containerKey: string) => string;
|
|
843
847
|
cannotUseBothImageAndBuildContext: (containerKey: string) => string;
|
|
@@ -883,6 +887,7 @@ export declare const Text: {
|
|
|
883
887
|
invalidInvokeRequestForAppId: (requestAppId: string) => string;
|
|
884
888
|
invalidInvokeRequestForAppEnv: (requestEnvId: string) => string;
|
|
885
889
|
errorValidatingInvokeRequest: (message: string) => string;
|
|
890
|
+
unableToStartContainerServices: string;
|
|
886
891
|
};
|
|
887
892
|
};
|
|
888
893
|
installationId: {
|
|
@@ -991,6 +996,7 @@ export declare const Text: {
|
|
|
991
996
|
cmd: {
|
|
992
997
|
desc: string;
|
|
993
998
|
keyOption: string;
|
|
999
|
+
tagOption: string;
|
|
994
1000
|
};
|
|
995
1001
|
prompt: {
|
|
996
1002
|
overview: string;
|
package/out/ui/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/ui/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI9D,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAKD,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,MAAsD,CAAC;AAoDjG,eAAO,MAAM,IAAI;8BA3EgB,MAAM;eAGrB,MAAM;;;;;6BAuFD,MAAM;2BACR,MAAM;6BAGJ,MAAM;+BAEJ,MAAM;;wCAIK,MAAM,UAAU,MAAM;qDAOT,MAAM,sBAAsB,MAAM;;wCAO/C,MAAM,EAAE;;;;;;;;6CAgBH,MAAM,YAAY,MAAM,YAAY,MAAM;;;kDAQrC,MAAM,EAAE;gDAKV,MAAM,aAAa,MAAM;8CAG3B,MAAM,aAAa,MAAM;uCAGhC,MAAM;iCAEZ,MAAM;;;;;;;;;;;;;;kDAmBS,MAAM;;;0DAKI,MAAM,EAAE;yCAEzB,MAAM;0CAEL,MAAM;;;yCAKP,MAAM;;;mDAUI,MAAM,yBAAyB,MAAM;;6BAM7D,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/ui/text.ts"],"names":[],"mappings":"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"}
|
package/out/ui/text.js
CHANGED
|
@@ -117,7 +117,8 @@ exports.Text = {
|
|
|
117
117
|
return `${chalk_1.default.bold('Warning')}: Your app is currently using deprecated UI Kit 1 modules: ${modules.join(', ')}. ${chalk_1.default.bold('UI Kit 1')} has been deprecated on February 28, 2025. Please refer to the ${(0, terminal_link_1.default)('documentation', 'https://developer.atlassian.com/platform/forge/ui-kit/upgrade-to-ui-kit-latest/#upgrade-from-ui-kit-1-to-ui-kit-latest-version')} to upgrade your modules.`;
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
|
-
oldCreateCommandDeprecation: `${chalk_1.default.bold('Warning')}: This command is deprecated and will be removed in newer versions of the CLI after May 2026. Use '${forge('webtrigger create')}' instead
|
|
120
|
+
oldCreateCommandDeprecation: `${chalk_1.default.bold('Warning')}: This command is deprecated and will be removed in newer versions of the CLI after May 2026. Use '${forge('webtrigger create')}' instead.`,
|
|
121
|
+
statsigFetchFailed: (type) => `Failed to fetch Forge ${type}. Some preview features may be unavailable. Rerun the command to retry.`
|
|
121
122
|
},
|
|
122
123
|
maxSizeOfUsersWithAccess: 10,
|
|
123
124
|
installationContext: {
|
|
@@ -1047,12 +1048,15 @@ ${buildTerminalLink(link)}\n`,
|
|
|
1047
1048
|
stoppingTunnel: 'Stopping tunnel...',
|
|
1048
1049
|
stoppedTunnel: 'Tunnel stopped.',
|
|
1049
1050
|
tunnelStatusChange: (status) => `Tunnel connection status changed: ${status}.`,
|
|
1051
|
+
authenticatingDocker: `Authenticating and starting docker containers...`,
|
|
1052
|
+
startingContainerService: (serviceKey) => `Starting containers for service: ${serviceKey}`,
|
|
1050
1053
|
functionHandlersMustBeDefined: `${chalk_1.default.bold('--debugFunctionHandlers')} flag must be defined in debug mode.`,
|
|
1051
1054
|
debugArgumentNameMismatch: (arg) => `Arguments of ${chalk_1.default.bold('--debugFunctionHandlers')}, namely '${arg}', must be function handlers defined in the manifest.`,
|
|
1052
1055
|
invalidDebugStartingPortNumber: (port) => `${chalk_1.default.bold('--debugStartingPort')} ${port} must be a valid port number.`,
|
|
1053
1056
|
unableToAuthenticateDocker: (errCode) => `Docker authentication process exited with code: ${errCode}.`,
|
|
1054
1057
|
unableToPullProxySidecarImage: (errMessage) => `Unable to pull the proxy sidecar image. Make sure to run 'forge containers docker-login' first. Full error: ${errMessage}`,
|
|
1055
|
-
unableToStartDockerComposeStack: (errMessage) => `Cannot start Docker Compose stack. This usually happens when Docker isn't running
|
|
1058
|
+
unableToStartDockerComposeStack: (errMessage) => `Cannot start Docker Compose stack. This usually happens when Docker isn't running or the provided manifest config is incorrect (e.g. configured Docker image doesn't exist). To fix this: Start a Docker engine, ensure the manifest config is correct, then retry the command. Full error: ${errMessage}`,
|
|
1059
|
+
UnableToParseDockerComposeFileError: (serviceKey, errMessage) => `Unable to parse the Docker Compose file for service: ${serviceKey}. Please ensure that the manifest tunnel config is correct. Full error: ${errMessage}`,
|
|
1056
1060
|
unableToStopDockerComposeStack: (serviceKey, errMessage) => `Failed to stop Docker Compose stack for ${serviceKey}. Full error: ${errMessage}`,
|
|
1057
1061
|
missingImageOrBuildContext: (containerKey) => `Container "${containerKey}" must either use an "image" config or "build" config in the tunnel configuration. Specify either an existing Docker image, or a build context from which the image will be built when the tunnel starts.`,
|
|
1058
1062
|
cannotUseBothImageAndBuildContext: (containerKey) => `Container "${containerKey}" cannot use both an "image" config and "build" config in the tunnel configuration. Specify either an existing Docker image, or a build context from which the image will be built when the tunnel starts.`,
|
|
@@ -1103,7 +1107,8 @@ ${buildTerminalLink(link)}\n`,
|
|
|
1103
1107
|
invalidSelfManagedTunnelPort: (port) => `Invalid tunnel port: ${port}. Port must be between 1 and 65535.`,
|
|
1104
1108
|
invalidInvokeRequestForAppId: (requestAppId) => `The provided self-managed tunnel is being used for a different app (App ID: ${requestAppId}). Please stop any other tunnels using the same tunnel URL and restart the tunnel.`,
|
|
1105
1109
|
invalidInvokeRequestForAppEnv: (requestEnvId) => `The provided self-managed tunnel is being used for a different app environment (environment ID: ${requestEnvId}). Please stop any other tunnels using the same tunnel URL and restart the tunnel.`,
|
|
1106
|
-
errorValidatingInvokeRequest: (message) => `Error validating tunnel invocation request: ${message}
|
|
1110
|
+
errorValidatingInvokeRequest: (message) => `Error validating tunnel invocation request: ${message}.`,
|
|
1111
|
+
unableToStartContainerServices: `Failed to start containers. Removing any containers which have already been started...`
|
|
1107
1112
|
}
|
|
1108
1113
|
},
|
|
1109
1114
|
installationId: {
|
|
@@ -1223,7 +1228,8 @@ ${buildTerminalLink(link)}\n`,
|
|
|
1223
1228
|
list: {
|
|
1224
1229
|
cmd: {
|
|
1225
1230
|
desc: 'list all images for the container',
|
|
1226
|
-
keyOption: 'specify the name of the container'
|
|
1231
|
+
keyOption: 'specify the name of the container',
|
|
1232
|
+
tagOption: 'filter images by tag'
|
|
1227
1233
|
},
|
|
1228
1234
|
prompt: {
|
|
1229
1235
|
overview: 'List all images for a container.',
|
|
@@ -1405,7 +1411,7 @@ When errors occur during Forge command execution, error details will be sent to
|
|
|
1405
1411
|
},
|
|
1406
1412
|
cmd: {
|
|
1407
1413
|
name: 'custom-scopes',
|
|
1408
|
-
description: '
|
|
1414
|
+
description: 'manage custom scopes',
|
|
1409
1415
|
subcmds: {
|
|
1410
1416
|
list: {
|
|
1411
1417
|
name: 'list',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/cli-shared",
|
|
3
|
-
"version": "8.15.
|
|
3
|
+
"version": "8.15.1-experimental-1ee2de3",
|
|
4
4
|
"description": "Common functionality for Forge CLI",
|
|
5
5
|
"author": "Atlassian",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"generate-graphql-types": "graphql-codegen --config src/graphql/codegen.yml"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forge/manifest": "12.
|
|
15
|
+
"@forge/manifest": "12.1.0-experimental-1ee2de3",
|
|
16
16
|
"@forge/util": "2.0.1",
|
|
17
17
|
"@forge/i18n": "0.0.7",
|
|
18
18
|
"@sentry/node": "7.106.0",
|