@forge/cli 10.13.6 → 11.0.0-next.18
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 +203 -0
- package/LICENSE.txt +7 -0
- package/npm-shrinkwrap.json +142 -130
- package/out/autocomplete/autocomplete-config.json +26 -0
- package/out/command-line/command.d.ts +15 -2
- package/out/command-line/command.d.ts.map +1 -1
- package/out/command-line/command.js +29 -6
- package/out/command-line/controller/deploy-controller.d.ts.map +1 -1
- package/out/command-line/controller/deploy-controller.js +4 -7
- package/out/command-line/controller/install-controller.d.ts +3 -3
- package/out/command-line/controller/install-controller.d.ts.map +1 -1
- package/out/command-line/controller/install-controller.js +16 -13
- package/out/command-line/controller/version-controller.d.ts +36 -0
- package/out/command-line/controller/version-controller.d.ts.map +1 -0
- package/out/command-line/controller/version-controller.js +114 -0
- package/out/command-line/dependency-injection.d.ts +4 -1
- package/out/command-line/dependency-injection.d.ts.map +1 -1
- package/out/command-line/dependency-injection.js +14 -6
- package/out/command-line/index.d.ts +1 -1
- package/out/command-line/index.d.ts.map +1 -1
- package/out/command-line/index.js +6 -4
- package/out/command-line/register-app-commands.d.ts.map +1 -1
- package/out/command-line/register-app-commands.js +9 -1
- package/out/command-line/register-installation-commands.d.ts +2 -10
- package/out/command-line/register-installation-commands.d.ts.map +1 -1
- package/out/command-line/register-installation-commands.js +29 -32
- package/out/command-line/register-version-commands.d.ts +4 -0
- package/out/command-line/register-version-commands.d.ts.map +1 -0
- package/out/command-line/register-version-commands.js +76 -0
- package/out/command-line/register-webtrigger-commands.d.ts +1 -1
- package/out/command-line/register-webtrigger-commands.d.ts.map +1 -1
- package/out/command-line/register-webtrigger-commands.js +13 -5
- package/out/command-line/view/deploy-view.d.ts +1 -1
- package/out/command-line/view/deploy-view.d.ts.map +1 -1
- package/out/command-line/view/deploy-view.js +2 -2
- package/out/command-line/view/version-view.d.ts +26 -0
- package/out/command-line/view/version-view.d.ts.map +1 -0
- package/out/command-line/view/version-view.js +198 -0
- package/out/environment/graphql-client.d.ts +1 -0
- package/out/environment/graphql-client.d.ts.map +1 -1
- package/out/environment/graphql-client.js +3 -1
- package/out/environment/list-environment.d.ts +1 -0
- package/out/environment/list-environment.d.ts.map +1 -1
- package/out/installations/graphql-client.d.ts +6 -5
- package/out/installations/graphql-client.d.ts.map +1 -1
- package/out/installations/graphql-client.js +44 -7
- package/out/installations/installation-helper.d.ts.map +1 -1
- package/out/installations/installation-helper.js +1 -1
- package/out/installations/site-translation/bitbucket.d.ts +3 -4
- package/out/installations/site-translation/bitbucket.d.ts.map +1 -1
- package/out/installations/site-translation/bitbucket.js +1 -1
- package/out/installations/site-translation/index.d.ts +1 -1
- package/out/installations/site-translation/index.d.ts.map +1 -1
- package/out/installations/site-translation/index.js +1 -1
- package/out/installations/site-translation/site-translation.d.ts +3 -4
- package/out/installations/site-translation/site-translation.d.ts.map +1 -1
- package/out/installations/site-translation/sited-products.d.ts +29 -0
- package/out/installations/site-translation/sited-products.d.ts.map +1 -0
- package/out/installations/site-translation/sited-products.js +133 -0
- package/out/service/installation-service.d.ts +18 -4
- package/out/service/installation-service.d.ts.map +1 -1
- package/out/service/installation-service.js +44 -10
- package/out/service/tunnel-service.d.ts.map +1 -1
- package/out/service/tunnel-service.js +1 -1
- package/out/service/version-service.d.ts +77 -0
- package/out/service/version-service.d.ts.map +1 -0
- package/out/service/version-service.js +163 -0
- package/out/version/graphql-client.d.ts +25 -0
- package/out/version/graphql-client.d.ts.map +1 -0
- package/out/version/graphql-client.js +144 -0
- package/package.json +13 -11
- package/out/installations/site-translation/cloudid-products.d.ts +0 -25
- package/out/installations/site-translation/cloudid-products.d.ts.map +0 -1
- package/out/installations/site-translation/cloudid-products.js +0 -103
|
@@ -122,6 +122,15 @@
|
|
|
122
122
|
"--verbose": {
|
|
123
123
|
"requireUserArg": false
|
|
124
124
|
},
|
|
125
|
+
"--site": {
|
|
126
|
+
"requireUserArg": true
|
|
127
|
+
},
|
|
128
|
+
"--product": {
|
|
129
|
+
"requireUserArg": true
|
|
130
|
+
},
|
|
131
|
+
"--environment": {
|
|
132
|
+
"requireUserArg": true
|
|
133
|
+
},
|
|
125
134
|
"--help": {
|
|
126
135
|
"requireUserArg": false
|
|
127
136
|
}
|
|
@@ -206,6 +215,15 @@
|
|
|
206
215
|
"--functionKey": {
|
|
207
216
|
"requireUserArg": true
|
|
208
217
|
},
|
|
218
|
+
"--site": {
|
|
219
|
+
"requireUserArg": true
|
|
220
|
+
},
|
|
221
|
+
"--product": {
|
|
222
|
+
"requireUserArg": true
|
|
223
|
+
},
|
|
224
|
+
"--environment": {
|
|
225
|
+
"requireUserArg": true
|
|
226
|
+
},
|
|
209
227
|
"--help": {
|
|
210
228
|
"requireUserArg": false
|
|
211
229
|
}
|
|
@@ -258,6 +276,14 @@
|
|
|
258
276
|
"--help": {
|
|
259
277
|
"requireUserArg": false
|
|
260
278
|
}
|
|
279
|
+
},
|
|
280
|
+
"version": {
|
|
281
|
+
"--verbose": {
|
|
282
|
+
"requireUserArg": false
|
|
283
|
+
},
|
|
284
|
+
"--help": {
|
|
285
|
+
"requireUserArg": false
|
|
286
|
+
}
|
|
261
287
|
}
|
|
262
288
|
},
|
|
263
289
|
"options": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import commander, { CommanderError } from 'commander';
|
|
2
2
|
import { CamelCase } from 'type-fest';
|
|
3
3
|
import { AnalyticsClientReporter } from '../analytics-client/analytics-client';
|
|
4
|
-
import { Logger, CLIDetails, CredentialGetter, PersonalApiCredentialsValidated, ErrorWithAnalytics, ErrorAnalytics, FeatureFlagService } from '@forge/cli-shared';
|
|
4
|
+
import { Logger, CLIDetails, CredentialGetter, PersonalApiCredentialsValidated, ErrorWithAnalytics, ErrorAnalytics, FeatureFlagService, SupportedProduct, SupportedProductsService } from '@forge/cli-shared';
|
|
5
5
|
import { PreCommandController } from './controller/pre-command-controller';
|
|
6
6
|
import * as autocomplete from '../autocomplete/types';
|
|
7
7
|
import { StubController } from './controller/stubController';
|
|
@@ -47,6 +47,7 @@ export declare class Command<Args extends AnyArgs = [], Opts extends AnyOpts = D
|
|
|
47
47
|
private readonly credentialStore;
|
|
48
48
|
private readonly defaultEnvironmentController;
|
|
49
49
|
private readonly featureFlagService;
|
|
50
|
+
private readonly supportedProductsService;
|
|
50
51
|
get verbose(): boolean;
|
|
51
52
|
private static isError;
|
|
52
53
|
private static isHelpTriggered;
|
|
@@ -60,7 +61,7 @@ export declare class Command<Args extends AnyArgs = [], Opts extends AnyOpts = D
|
|
|
60
61
|
private readonly requiresAnalyticsConsent;
|
|
61
62
|
private readonly requiredOptionFlags;
|
|
62
63
|
private readonly preconditionFn;
|
|
63
|
-
static program(ui: Logger, analyticsClient: AnalyticsClientReporter, preCommandController: PreCommandController, cliDetails: CLIDetails | undefined, credentialStore: CredentialGetter, defaultEnvironmentController: DefaultEnvironmentController, featureFlagService: FeatureFlagService): Command<[], DefaultOpts>;
|
|
64
|
+
static program(ui: Logger, analyticsClient: AnalyticsClientReporter, preCommandController: PreCommandController, cliDetails: CLIDetails | undefined, credentialStore: CredentialGetter, defaultEnvironmentController: DefaultEnvironmentController, featureFlagService: FeatureFlagService, supportedProductsService: SupportedProductsService): Command<[], DefaultOpts>;
|
|
64
65
|
private constructor();
|
|
65
66
|
private clone;
|
|
66
67
|
version(str: string, flags?: string): Command<Args, Opts>;
|
|
@@ -80,6 +81,10 @@ export declare class Command<Args extends AnyArgs = [], Opts extends AnyOpts = D
|
|
|
80
81
|
environmentOption(): Command<Args, Opts & {
|
|
81
82
|
environment: string;
|
|
82
83
|
}>;
|
|
84
|
+
contextOption(supportedProducts: SupportedProduct[]): Command<Args, Opts & {
|
|
85
|
+
site?: URL;
|
|
86
|
+
product?: SupportedProduct;
|
|
87
|
+
}>;
|
|
83
88
|
jsonOption(): Command<Args, Opts & {
|
|
84
89
|
json: boolean;
|
|
85
90
|
}>;
|
|
@@ -99,5 +104,13 @@ export declare class Command<Args extends AnyArgs = [], Opts extends AnyOpts = D
|
|
|
99
104
|
getAutocompleteConfig(): autocomplete.AutocompleteConfig;
|
|
100
105
|
}
|
|
101
106
|
export declare function getAutocompleteConfig(cmd: commander.Command): autocomplete.AutocompleteConfig;
|
|
107
|
+
export declare function validateContext({ supportedProductsService, site, product }: {
|
|
108
|
+
supportedProductsService: SupportedProductsService;
|
|
109
|
+
site?: string;
|
|
110
|
+
product?: string;
|
|
111
|
+
}): Promise<{
|
|
112
|
+
site?: URL;
|
|
113
|
+
product?: SupportedProduct;
|
|
114
|
+
}>;
|
|
102
115
|
export {};
|
|
103
116
|
//# sourceMappingURL=command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/command-line/command.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,cAAc,EAAU,MAAM,WAAW,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAEL,MAAM,EAEN,UAAU,EAEV,gBAAgB,EAChB,+BAA+B,EAE/B,kBAAkB,EAClB,cAAc,EAEd,kBAAkB,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/command-line/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAutocompleteConfig = exports.Command = exports.WrapperError = void 0;
|
|
3
|
+
exports.validateContext = exports.getAutocompleteConfig = exports.Command = exports.WrapperError = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const commander_1 = tslib_1.__importStar(require("commander"));
|
|
6
6
|
const semver_1 = tslib_1.__importDefault(require("semver"));
|
|
@@ -36,6 +36,7 @@ class Command {
|
|
|
36
36
|
credentialStore;
|
|
37
37
|
defaultEnvironmentController;
|
|
38
38
|
featureFlagService;
|
|
39
|
+
supportedProductsService;
|
|
39
40
|
get verbose() {
|
|
40
41
|
return this.cmd.opts().verbose;
|
|
41
42
|
}
|
|
@@ -63,11 +64,11 @@ class Command {
|
|
|
63
64
|
requiresAnalyticsConsent;
|
|
64
65
|
requiredOptionFlags = [];
|
|
65
66
|
preconditionFn = [];
|
|
66
|
-
static program(ui, analyticsClient, preCommandController, cliDetails, credentialStore, defaultEnvironmentController, featureFlagService) {
|
|
67
|
-
const cmd = new Command(ui, analyticsClient, preCommandController, cliDetails, credentialStore, defaultEnvironmentController, featureFlagService, {});
|
|
67
|
+
static program(ui, analyticsClient, preCommandController, cliDetails, credentialStore, defaultEnvironmentController, featureFlagService, supportedProductsService) {
|
|
68
|
+
const cmd = new Command(ui, analyticsClient, preCommandController, cliDetails, credentialStore, defaultEnvironmentController, featureFlagService, supportedProductsService, {});
|
|
68
69
|
return cmd.version(cliDetails?.version ?? 'unknown', '--version').option('--verbose', cli_shared_1.Text.optionVerbose);
|
|
69
70
|
}
|
|
70
|
-
constructor(ui, analyticsClient, preCommandController, cliDetails, credentialStore, defaultEnvironmentController, featureFlagService, { cmd, analyticsName, requiresAuthentication, requiresAnalyticsConsent, requiredOptionFlags, preconditionFn }) {
|
|
71
|
+
constructor(ui, analyticsClient, preCommandController, cliDetails, credentialStore, defaultEnvironmentController, featureFlagService, supportedProductsService, { cmd, analyticsName, requiresAuthentication, requiresAnalyticsConsent, requiredOptionFlags, preconditionFn }) {
|
|
71
72
|
this.ui = ui;
|
|
72
73
|
this.analyticsClient = analyticsClient;
|
|
73
74
|
this.preCommandController = preCommandController;
|
|
@@ -75,6 +76,7 @@ class Command {
|
|
|
75
76
|
this.credentialStore = credentialStore;
|
|
76
77
|
this.defaultEnvironmentController = defaultEnvironmentController;
|
|
77
78
|
this.featureFlagService = featureFlagService;
|
|
79
|
+
this.supportedProductsService = supportedProductsService;
|
|
78
80
|
this.cmd = cmd || new commander_1.default.Command();
|
|
79
81
|
this.analyticsName = analyticsName;
|
|
80
82
|
this.requiresAuthentication = requiresAuthentication ?? true;
|
|
@@ -90,7 +92,7 @@ class Command {
|
|
|
90
92
|
this.cmd.configureHelp({ sortSubcommands: true });
|
|
91
93
|
}
|
|
92
94
|
clone(overrides) {
|
|
93
|
-
return new Command(this.ui, this.analyticsClient, this.preCommandController, this.cliDetails, this.credentialStore, this.defaultEnvironmentController, this.featureFlagService, {
|
|
95
|
+
return new Command(this.ui, this.analyticsClient, this.preCommandController, this.cliDetails, this.credentialStore, this.defaultEnvironmentController, this.featureFlagService, this.supportedProductsService, {
|
|
94
96
|
cmd: this.cmd,
|
|
95
97
|
analyticsName: this.analyticsName,
|
|
96
98
|
requiresAuthentication: this.requiresAuthentication,
|
|
@@ -109,7 +111,7 @@ class Command {
|
|
|
109
111
|
.command(name, opts)
|
|
110
112
|
.allowUnknownOption(false)
|
|
111
113
|
.allowExcessArguments(false);
|
|
112
|
-
const subCommand = new Command(this.ui, this.analyticsClient, this.preCommandController, this.cliDetails, this.credentialStore, this.defaultEnvironmentController, this.featureFlagService, {
|
|
114
|
+
const subCommand = new Command(this.ui, this.analyticsClient, this.preCommandController, this.cliDetails, this.credentialStore, this.defaultEnvironmentController, this.featureFlagService, this.supportedProductsService, {
|
|
113
115
|
cmd,
|
|
114
116
|
analyticsName: Command.concatenateNames(this.analyticsName, cmd.name())
|
|
115
117
|
}).option('--verbose', cli_shared_1.Text.optionVerbose);
|
|
@@ -176,6 +178,15 @@ class Command {
|
|
|
176
178
|
return { environment: (0, environment_1.checkEnvironmentOption)(environment) };
|
|
177
179
|
});
|
|
178
180
|
}
|
|
181
|
+
contextOption(supportedProducts) {
|
|
182
|
+
const supportedProductsService = this.supportedProductsService;
|
|
183
|
+
return this.option('-s, --site [site]', cli_shared_1.Text.optionSite)
|
|
184
|
+
.option('-p, --product [product]', cli_shared_1.Text.optionProduct(supportedProducts))
|
|
185
|
+
.precondition(async (...args) => {
|
|
186
|
+
const { site, product } = last(args);
|
|
187
|
+
return await validateContext({ supportedProductsService, site, product });
|
|
188
|
+
});
|
|
189
|
+
}
|
|
179
190
|
jsonOption() {
|
|
180
191
|
return this.option('--json', cli_shared_1.Text.optionJson, false);
|
|
181
192
|
}
|
|
@@ -416,3 +427,15 @@ function getAutocompleteConfig(cmd) {
|
|
|
416
427
|
return { commands, options };
|
|
417
428
|
}
|
|
418
429
|
exports.getAutocompleteConfig = getAutocompleteConfig;
|
|
430
|
+
async function validateContext({ supportedProductsService, site, product }) {
|
|
431
|
+
let maybeSupportedProduct = undefined;
|
|
432
|
+
let maybeSiteUrl = undefined;
|
|
433
|
+
if (product !== undefined) {
|
|
434
|
+
maybeSupportedProduct = await supportedProductsService.validateSupportedProduct(product);
|
|
435
|
+
}
|
|
436
|
+
if (site) {
|
|
437
|
+
maybeSiteUrl = await supportedProductsService.validateSite(site, maybeSupportedProduct);
|
|
438
|
+
}
|
|
439
|
+
return { site: maybeSiteUrl, product: maybeSupportedProduct };
|
|
440
|
+
}
|
|
441
|
+
exports.validateContext = validateContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/deploy-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAGpB,UAAU,EACV,cAAc,EAEd,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAA+B,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACzG,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM,EAAE;IAItC,aAAa,IAAI,cAAc;IAM/B,WAAW,IAAI,OAAO;CAG9B;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAGpC,aAAa,IAAI,cAAc;IAM/B,WAAW,IAAI,OAAO;CAG9B;AAED,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iCAAiC;IAClD,OAAO,CAAC,QAAQ,CAAC,8BAA8B;IAC/C,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBAXxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,oBAAoB,EAAE,mBAAmB,EACzC,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,oBAAoB,EAAE,oBAAoB,EAC1C,UAAU,EAAE,UAAU,EACtB,iCAAiC,EAAE,0BAA0B,EAC7D,8BAA8B,EAAE,0BAA0B,EAC1D,wBAAwB,EAAE,wBAAwB;IAGrE,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,6BAA6B;YAWvB,wBAAwB;YA2BxB,mBAAmB;YAmCnB,oBAAoB;YA4BpB,2BAA2B;YAe3B,wBAAwB;IAkBzB,GAAG,CAAC,EACf,WAAW,EACX,MAAM,EACN,cAAc,EACd,YAAY,EACb,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/deploy-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EAGpB,UAAU,EACV,cAAc,EAEd,WAAW,EAIZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAA+B,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACzG,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM,EAAE;IAItC,aAAa,IAAI,cAAc;IAM/B,WAAW,IAAI,OAAO;CAG9B;AAED,qBAAa,sBAAuB,SAAQ,WAAW;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAGpC,aAAa,IAAI,cAAc;IAM/B,WAAW,IAAI,OAAO;CAG9B;AAED,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,iCAAiC;IAClD,OAAO,CAAC,QAAQ,CAAC,8BAA8B;IAC/C,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBAXxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,EACxB,oBAAoB,EAAE,mBAAmB,EACzC,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,oBAAoB,EAAE,oBAAoB,EAC1C,UAAU,EAAE,UAAU,EACtB,iCAAiC,EAAE,0BAA0B,EAC7D,8BAA8B,EAAE,0BAA0B,EAC1D,wBAAwB,EAAE,wBAAwB;IAGrE,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,6BAA6B;YAWvB,wBAAwB;YA2BxB,mBAAmB;YAmCnB,oBAAoB;YA4BpB,2BAA2B;YAe3B,wBAAwB;IAkBzB,GAAG,CAAC,EACf,WAAW,EACX,MAAM,EACN,cAAc,EACd,YAAY,EACb,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAiFpD"}
|
|
@@ -203,15 +203,12 @@ class DeployController {
|
|
|
203
203
|
}
|
|
204
204
|
const handlers = await this.configFile.getAppHandlers();
|
|
205
205
|
const resources = await this.configFile.getResources();
|
|
206
|
-
let
|
|
206
|
+
let hasNoInstallationsForEnv = true;
|
|
207
207
|
try {
|
|
208
|
-
|
|
209
|
-
environment: 'production'
|
|
210
|
-
});
|
|
211
|
-
hasProdInstallations = !prodInstallations.installations.length;
|
|
208
|
+
hasNoInstallationsForEnv = await this.installationsService.hasNoAppInstallationsForEnv(appDetails.environmentType);
|
|
212
209
|
}
|
|
213
210
|
catch (err) {
|
|
214
|
-
this.deployView.
|
|
211
|
+
this.deployView.displayHasNoAppInstallationsForEnvError();
|
|
215
212
|
if (verify) {
|
|
216
213
|
throw err;
|
|
217
214
|
}
|
|
@@ -221,7 +218,7 @@ class DeployController {
|
|
|
221
218
|
: this.sandboxPackageUploadDeployCommand;
|
|
222
219
|
const config = await this.configFile.readConfig();
|
|
223
220
|
const packageConfig = config.app?.package;
|
|
224
|
-
const analytics = await this.deployView.reportDeploymentProgress(appDetails,
|
|
221
|
+
const analytics = await this.deployView.reportDeploymentProgress(appDetails, hasNoInstallationsForEnv, () => deployCommand.execute({
|
|
225
222
|
handlers,
|
|
226
223
|
resources,
|
|
227
224
|
environmentKey: environment,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { AppConfigProvider, ConfigFile, UI,
|
|
2
|
+
import { AppConfigProvider, ConfigFile, UI, SupportedProductsService } from '@forge/cli-shared';
|
|
3
3
|
import { URL } from 'url';
|
|
4
4
|
import { InstallAppSiteCommand } from '../../installations/install-app-site';
|
|
5
5
|
import { InstallationService } from '../../service/installation-service';
|
|
@@ -25,8 +25,8 @@ export declare class InstallController {
|
|
|
25
25
|
private readonly installAppSiteCommand;
|
|
26
26
|
private readonly installationService;
|
|
27
27
|
private readonly installView;
|
|
28
|
-
private readonly
|
|
29
|
-
constructor(appConfigProvider: AppConfigProvider, configFile: ConfigFile, ui: UI, installAppSiteCommand: InstallAppSiteCommand, installationService: InstallationService, installView: InstallView,
|
|
28
|
+
private readonly supportedProductsService;
|
|
29
|
+
constructor(appConfigProvider: AppConfigProvider, configFile: ConfigFile, ui: UI, installAppSiteCommand: InstallAppSiteCommand, installationService: InstallationService, installView: InstallView, supportedProductsService: SupportedProductsService);
|
|
30
30
|
private securityPrompt;
|
|
31
31
|
private installOrUpgrade;
|
|
32
32
|
private promptForProduct;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/install-controller.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,iBAAiB,EAEjB,UAAU,EAEV,EAAE,
|
|
1
|
+
{"version":3,"file":"install-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/install-controller.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,iBAAiB,EAEjB,UAAU,EAEV,EAAE,EAYF,wBAAwB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAA6B,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACpG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAYD,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,WAAW,EAAE,MAAM;CAGhC;AASD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,wBAAwB;gBANxB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,EAAE,EACN,qBAAqB,EAAE,qBAAqB,EAC5C,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,wBAAwB,EAAE,wBAAwB;YAGvD,cAAc;YAmBd,gBAAgB;YA8ChB,gBAAgB;YAQhB,aAAa;YAsBb,gBAAgB;IAwB9B,OAAO,CAAC,uCAAuC;IAY/C,OAAO,CAAC,cAAc;IAGtB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,qBAAqB,CAK3B;IAEW,GAAG,CAAC,EACf,WAAW,EACX,IAAI,EACJ,OAAO,EACP,OAAO,EACP,aAAa,EACb,OAAO,EACP,YAAY,EACZ,eAAe,EACf,cAAc,EACf,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAkHrB,kBAAkB;IAUhC,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,uBAAuB;YAoBjB,8CAA8C;CAW7D"}
|
|
@@ -16,15 +16,15 @@ class InstallController {
|
|
|
16
16
|
installAppSiteCommand;
|
|
17
17
|
installationService;
|
|
18
18
|
installView;
|
|
19
|
-
|
|
20
|
-
constructor(appConfigProvider, configFile, ui, installAppSiteCommand, installationService, installView,
|
|
19
|
+
supportedProductsService;
|
|
20
|
+
constructor(appConfigProvider, configFile, ui, installAppSiteCommand, installationService, installView, supportedProductsService) {
|
|
21
21
|
this.appConfigProvider = appConfigProvider;
|
|
22
22
|
this.configFile = configFile;
|
|
23
23
|
this.ui = ui;
|
|
24
24
|
this.installAppSiteCommand = installAppSiteCommand;
|
|
25
25
|
this.installationService = installationService;
|
|
26
26
|
this.installView = installView;
|
|
27
|
-
this.
|
|
27
|
+
this.supportedProductsService = supportedProductsService;
|
|
28
28
|
}
|
|
29
29
|
async securityPrompt(site) {
|
|
30
30
|
this.ui.info(cli_shared_1.Text.install.security.banner(site.host));
|
|
@@ -43,6 +43,7 @@ class InstallController {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
async installOrUpgrade(upgrade, environment, environmentType, site, product, appId, text, license, overrides) {
|
|
46
|
+
const isWorkspaceProduct = !!product && (await this.supportedProductsService.isWorkspaceProduct(product));
|
|
46
47
|
return this.ui.displayProgress(async () => {
|
|
47
48
|
if (upgrade) {
|
|
48
49
|
const isAlreadyUpdated = await this.installationService.upgradeInstallation(site, product, environment, appId);
|
|
@@ -60,7 +61,7 @@ class InstallController {
|
|
|
60
61
|
}
|
|
61
62
|
}, text.cmd.start(environment, environmentType), (alreadyUpdated) => {
|
|
62
63
|
if (alreadyUpdated) {
|
|
63
|
-
return
|
|
64
|
+
return isWorkspaceProduct
|
|
64
65
|
? cli_shared_1.Text.upgrade.alreadyUpdated.spinnerWorkspace
|
|
65
66
|
: cli_shared_1.Text.upgrade.alreadyUpdated.spinnerSite;
|
|
66
67
|
}
|
|
@@ -71,11 +72,10 @@ class InstallController {
|
|
|
71
72
|
}
|
|
72
73
|
async promptForProduct() {
|
|
73
74
|
this.ui.info(cli_shared_1.Text.installationContext.overviewProduct);
|
|
74
|
-
|
|
75
|
-
return await this.ui.promptForList(cli_shared_1.Text.installationContext.promptProduct, (0, cli_shared_1.getSupportedProducts)({ enableAtlas }));
|
|
75
|
+
return await this.ui.promptForList(cli_shared_1.Text.installationContext.promptProduct, await this.supportedProductsService.getSupportedProducts());
|
|
76
76
|
}
|
|
77
77
|
async promptForSite(product) {
|
|
78
|
-
const isWorkspaceBased = product && (
|
|
78
|
+
const isWorkspaceBased = product && (await this.supportedProductsService.isWorkspaceProduct(product));
|
|
79
79
|
const overviewText = isWorkspaceBased
|
|
80
80
|
? cli_shared_1.Text.installationContext.overviewWorkspace
|
|
81
81
|
: cli_shared_1.Text.installationContext.overviewSite;
|
|
@@ -88,18 +88,19 @@ class InstallController {
|
|
|
88
88
|
if (!trySite) {
|
|
89
89
|
throw new cli_shared_1.ValidationError(invalidText);
|
|
90
90
|
}
|
|
91
|
-
return
|
|
91
|
+
return this.supportedProductsService.validateSite(trySite, product);
|
|
92
92
|
}
|
|
93
93
|
async promptForUpgrade(siteOption, productOption, environmentOption) {
|
|
94
94
|
const { installations } = await this.installationService.listNonTechnicalAppInstallations({
|
|
95
|
-
site: siteOption
|
|
95
|
+
site: siteOption,
|
|
96
96
|
product: productOption,
|
|
97
97
|
environment: environmentOption
|
|
98
98
|
});
|
|
99
99
|
const { site, product, environmentKey, environmentType } = await this.installView.promptForUpgrade(installations);
|
|
100
|
+
const productName = (0, cli_shared_1.productDisplayName)(product);
|
|
100
101
|
return {
|
|
101
|
-
site:
|
|
102
|
-
product:
|
|
102
|
+
site: await this.supportedProductsService.validateSite(site, productName),
|
|
103
|
+
product: productName,
|
|
103
104
|
environment: environmentKey,
|
|
104
105
|
environmentType
|
|
105
106
|
};
|
|
@@ -155,7 +156,9 @@ class InstallController {
|
|
|
155
156
|
}
|
|
156
157
|
product = product ? product : await this.promptForProduct();
|
|
157
158
|
site = site ? site : await this.promptForSite(product);
|
|
158
|
-
const bannerText = product && (
|
|
159
|
+
const bannerText = product && (await this.supportedProductsService.isWorkspaceProduct(product))
|
|
160
|
+
? text.bannerWorkspace
|
|
161
|
+
: text.bannerSite;
|
|
159
162
|
this.ui.info(bannerText);
|
|
160
163
|
if ((0, cli_shared_1.isSecureSite)(site)) {
|
|
161
164
|
await this.securityPrompt(site);
|
|
@@ -193,7 +196,7 @@ class InstallController {
|
|
|
193
196
|
if (!uniqueProductsFromScopes || uniqueProductsFromScopes.length <= 1)
|
|
194
197
|
return;
|
|
195
198
|
const { installations } = await this.installationService.listNonTechnicalAppInstallations({
|
|
196
|
-
site
|
|
199
|
+
site,
|
|
197
200
|
environment
|
|
198
201
|
});
|
|
199
202
|
const productsToUpgrade = installations
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { VersionView } from '../view/version-view';
|
|
2
|
+
import { VersionService } from '../../service/version-service';
|
|
3
|
+
interface AppVersionOptions {
|
|
4
|
+
environment: string;
|
|
5
|
+
majorVersion?: number;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
outFile?: string;
|
|
8
|
+
nonInteractive?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface AppVersionDiffOptions {
|
|
11
|
+
environment: string;
|
|
12
|
+
version1: number;
|
|
13
|
+
version2: number;
|
|
14
|
+
outFile?: string;
|
|
15
|
+
}
|
|
16
|
+
interface AppVersionListOptions {
|
|
17
|
+
environment: string;
|
|
18
|
+
json?: boolean;
|
|
19
|
+
outFile?: string;
|
|
20
|
+
nonInteractive?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class VersionController {
|
|
23
|
+
private readonly versionService;
|
|
24
|
+
private readonly view;
|
|
25
|
+
constructor(versionService: VersionService, view: VersionView);
|
|
26
|
+
getAppVersionDiff({ environment, version1, version2, outFile }: AppVersionDiffOptions): Promise<void>;
|
|
27
|
+
getAppVersionDetails({ environment, majorVersion, json, outFile, nonInteractive }: AppVersionOptions): Promise<void>;
|
|
28
|
+
private writeToFile;
|
|
29
|
+
private displayInJson;
|
|
30
|
+
private displayDetailsInTable;
|
|
31
|
+
private displayDiffInText;
|
|
32
|
+
private writeDiffToFile;
|
|
33
|
+
getVersionList({ environment, json, outFile, nonInteractive }: AppVersionListOptions): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=version-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-controller.d.ts","sourceRoot":"","sources":["../../../src/command-line/controller/version-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAkB,MAAM,+BAA+B,CAAC;AAI/E,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAsBD,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,WAAW;IAGvB,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAerG,oBAAoB,CAAC,EAChC,WAAW,EACX,YAAY,EACZ,IAAY,EACZ,OAAO,EACP,cAAc,EACf,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,eAAe;IAWV,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBlH"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VersionController = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const diff = tslib_1.__importStar(require("diff"));
|
|
7
|
+
const defaultProperties = ['appVersion', 'deploymentDateTime', 'environmentType'];
|
|
8
|
+
function filterObjectProperties(source, filteredProperties, defaultProperties) {
|
|
9
|
+
const result = {};
|
|
10
|
+
for (const prop of [...filteredProperties, ...defaultProperties]) {
|
|
11
|
+
result[prop] = source[prop];
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
class VersionController {
|
|
16
|
+
versionService;
|
|
17
|
+
view;
|
|
18
|
+
constructor(versionService, view) {
|
|
19
|
+
this.versionService = versionService;
|
|
20
|
+
this.view = view;
|
|
21
|
+
}
|
|
22
|
+
async getAppVersionDiff({ environment, version1, version2, outFile }) {
|
|
23
|
+
const [version1Details, version2Details] = await this.view.displayDiffProgress(() => Promise.all([
|
|
24
|
+
this.versionService.getAppVersionDetails(environment, version1),
|
|
25
|
+
this.versionService.getAppVersionDetails(environment, version2)
|
|
26
|
+
]));
|
|
27
|
+
if (outFile) {
|
|
28
|
+
this.writeDiffToFile(version1Details, version2Details, outFile);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.displayDiffInText(version1Details, version2Details, environment);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async getAppVersionDetails({ environment, majorVersion, json = false, outFile, nonInteractive }) {
|
|
35
|
+
let filteredProperties = [];
|
|
36
|
+
if (!nonInteractive) {
|
|
37
|
+
filteredProperties = await this.view.promptVersionDetailsProperties();
|
|
38
|
+
}
|
|
39
|
+
const request = this.versionService.getAppVersionDetails(environment, majorVersion);
|
|
40
|
+
const versionDetails = nonInteractive ? await request : await this.view.displayDetailsProgress(() => request);
|
|
41
|
+
if (filteredProperties.length === 0) {
|
|
42
|
+
filteredProperties = Object.keys(versionDetails);
|
|
43
|
+
}
|
|
44
|
+
const filteredVersionDetails = filterObjectProperties(versionDetails, filteredProperties, defaultProperties);
|
|
45
|
+
if (outFile) {
|
|
46
|
+
this.writeToFile(filteredVersionDetails, outFile);
|
|
47
|
+
}
|
|
48
|
+
else if (json) {
|
|
49
|
+
this.displayInJson(filteredVersionDetails);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.displayDetailsInTable(filteredVersionDetails, environment);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
writeToFile(data, outFile) {
|
|
56
|
+
this.view.displayWriteToFile(outFile);
|
|
57
|
+
(0, fs_1.writeFileSync)(outFile, JSON.stringify(data, null, 2));
|
|
58
|
+
}
|
|
59
|
+
displayInJson(data) {
|
|
60
|
+
this.view.displayDataInJson(data);
|
|
61
|
+
}
|
|
62
|
+
displayDetailsInTable(details, environment) {
|
|
63
|
+
this.view.displayVersionDetailsBanner(details.appVersion, environment, details.environmentType);
|
|
64
|
+
this.view.displayDetailsAsTable(details);
|
|
65
|
+
}
|
|
66
|
+
displayDiffInText(version1, version2, environment) {
|
|
67
|
+
this.view.displayDiffBanner(version1.appVersion, version2.appVersion, environment, version1.environmentType);
|
|
68
|
+
this.view.displayDiffAsTable({ v1: version1.appVersion, v2: version2.appVersion }, [
|
|
69
|
+
{
|
|
70
|
+
key: 'scopes',
|
|
71
|
+
diff: diff.diffJson(version1.scopes, version2.scopes)
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: 'deployment date',
|
|
75
|
+
diff: diff.diffJson(version1.deploymentDateTime, version2.deploymentDateTime)
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
key: 'egress',
|
|
79
|
+
diff: diff.diffJson(version1.egresses, version2.egresses)
|
|
80
|
+
},
|
|
81
|
+
{ key: 'policies', diff: diff.diffJson(version1.policies, version2.policies) },
|
|
82
|
+
{ key: 'connect keys', diff: diff.diffJson(version1.connectKeys, version2.connectKeys) },
|
|
83
|
+
{
|
|
84
|
+
key: 'functions',
|
|
85
|
+
diff: diff.diffJson(version1.functions, version2.functions)
|
|
86
|
+
},
|
|
87
|
+
{ key: 'modules', diff: diff.diffJson(version1.modules, version2.modules) },
|
|
88
|
+
{ key: 'remotes', diff: diff.diffJson(version1.remotes, version2.remotes) },
|
|
89
|
+
{ key: 'license', diff: diff.diffJson('' + version1.requiresLicense, '' + version2.requiresLicense) }
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
writeDiffToFile(version1, version2, outFile) {
|
|
93
|
+
this.view.displayWriteToFile(outFile);
|
|
94
|
+
const patch = diff.createTwoFilesPatch(`${version1.appVersion}`, `${version2.appVersion}`, JSON.stringify(version1, null, 2), JSON.stringify(version2, null, 2));
|
|
95
|
+
(0, fs_1.writeFileSync)(outFile, patch);
|
|
96
|
+
}
|
|
97
|
+
async getVersionList({ environment, json, outFile, nonInteractive }) {
|
|
98
|
+
const request = this.versionService.getAppVersionOverviewList(environment);
|
|
99
|
+
const versionList = nonInteractive || json ? await request : await this.view.displayListProgress(() => request);
|
|
100
|
+
if (!nonInteractive && !json) {
|
|
101
|
+
this.view.displayListBanner(versionList.length, environment, versionList[0].environmentType);
|
|
102
|
+
}
|
|
103
|
+
if (outFile) {
|
|
104
|
+
this.writeToFile(versionList, outFile);
|
|
105
|
+
}
|
|
106
|
+
else if (json) {
|
|
107
|
+
this.displayInJson(versionList);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.view.displayVersionList(versionList);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.VersionController = VersionController;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CLIDetails, CommandLineUI, ConfigFile, CreateAppCommand, FeatureFlagService, GetAppOwnerQuery, LoginCommand, LogoutCommand, RegisterAppCommand, ViewAppLogsCommand, UserRepositoryImpl } from '@forge/cli-shared';
|
|
1
|
+
import { CLIDetails, CommandLineUI, ConfigFile, CreateAppCommand, FeatureFlagService, GetAppOwnerQuery, LoginCommand, LogoutCommand, RegisterAppCommand, ViewAppLogsCommand, UserRepositoryImpl, SupportedProductsService } from '@forge/cli-shared';
|
|
2
2
|
import { AnalyticsClientReporter } from '../analytics-client/analytics-client';
|
|
3
3
|
import { PackageUploadDeployCommand } from '../deploy';
|
|
4
4
|
import { DeleteEnvironmentVariableCommand } from '../environment-variables/delete-environment-variable';
|
|
@@ -29,6 +29,7 @@ import { StubController } from './controller/stubController';
|
|
|
29
29
|
import { PrerequisitesController } from './controller/prerequisites-controller';
|
|
30
30
|
import { DefaultEnvironmentController } from './controller/default-environment-controller';
|
|
31
31
|
import { EligibilityController } from './controller/eligibility-controller';
|
|
32
|
+
import { VersionController } from './controller/version-controller';
|
|
32
33
|
export declare const getDependencies: (cliDetails: CLIDetails | undefined) => Promise<{
|
|
33
34
|
ui: CommandLineUI;
|
|
34
35
|
cmd: Command<[], import("./command").DefaultOpts>;
|
|
@@ -65,6 +66,7 @@ export declare const getDependencies: (cliDetails: CLIDetails | undefined) => Pr
|
|
|
65
66
|
customEntitiesService: CustomEntitiesService;
|
|
66
67
|
credentialStore: import("@forge/cli-shared").CredentialStore;
|
|
67
68
|
userRepository: UserRepositoryImpl;
|
|
69
|
+
supportedProductsService: SupportedProductsService;
|
|
68
70
|
};
|
|
69
71
|
controllers: {
|
|
70
72
|
autocompleteController: AutocompleteController;
|
|
@@ -79,6 +81,7 @@ export declare const getDependencies: (cliDetails: CLIDetails | undefined) => Pr
|
|
|
79
81
|
stubController: StubController;
|
|
80
82
|
prerequisitesController: PrerequisitesController;
|
|
81
83
|
defaultEnvironmentController: DefaultEnvironmentController;
|
|
84
|
+
versionController: VersionController;
|
|
82
85
|
};
|
|
83
86
|
}>;
|
|
84
87
|
declare type PromiseType<T> = T extends Promise<infer R> ? R : never;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-injection.d.ts","sourceRoot":"","sources":["../../src/command-line/dependency-injection.ts"],"names":[],"mappings":"AAIA,OAAO,EASL,UAAU,EACV,aAAa,EAEb,UAAU,EAGV,gBAAgB,EAGhB,kBAAkB,EAGlB,gBAAgB,EAQhB,YAAY,EACZ,aAAa,EAOb,kBAAkB,EAIlB,kBAAkB,EAElB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"dependency-injection.d.ts","sourceRoot":"","sources":["../../src/command-line/dependency-injection.ts"],"names":[],"mappings":"AAIA,OAAO,EASL,UAAU,EACV,aAAa,EAEb,UAAU,EAGV,gBAAgB,EAGhB,kBAAkB,EAGlB,gBAAgB,EAQhB,YAAY,EACZ,aAAa,EAOb,kBAAkB,EAIlB,kBAAkB,EAElB,kBAAkB,EAKlB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAc3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAML,0BAA0B,EAG3B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,gCAAgC,EAAE,MAAM,sDAAsD,CAAC;AAExG,OAAO,EAAE,+BAA+B,EAAE,MAAM,qDAAqD,CAAC;AACtG,OAAO,EAAE,6BAA6B,EAAE,MAAM,mDAAmD,CAAC;AAIlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAG3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAM7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAQtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAI3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAG3E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAUlE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAGhF,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAG3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAKpE,eAAO,MAAM,eAAe,eAAsB,UAAU,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8XvE,CAAC;AAGF,aAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC7D,oBAAY,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC"}
|