Skip to content

Commit 57ce7f0

Browse files
authored
additional deploy config - tenant ID & redirect URI (Azure#27103)
### Packages impacted by this PR api-management-custom-widgets-scaffolder ### Provide a list of related PRs _(if any)_ Azure#26593 ### Describe the problem that is addressed by this PR This PR adds options to specify during scaffolding process tenant ID and redirect URI for InteractiveBrowserCredential of Azure Identity, which were added to the tools package in the related PR. Also it updates tools package in templates to the latest version. ### Checklists - [X] Added impacted package name to the issue description - [ ] Does this PR needs any fixes in the SDK Generator?** _(If so, create an Issue in the [Autorest/typescript](https://github.com/Azure/autorest.typescript) repository and link it here)_ - [X] Added a changelog (if necessary)
1 parent 07233d7 commit 57ce7f0

File tree

19 files changed

+145
-44
lines changed

19 files changed

+145
-44
lines changed

sdk/apimanagement/api-management-custom-widgets-scaffolder/CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
### Features Added
66

7-
### Breaking Changes
8-
9-
### Bugs Fixed
7+
- added options to specify tenant ID and redirect URI for InteractiveBrowserCredential of Azure Identity
108

119
### Other Changes
1210

11+
- updated "tools" package version
12+
1313
## 1.0.0-beta.2 (2022-08-26)
1414

1515
### Bugs fixed

sdk/apimanagement/api-management-custom-widgets-scaffolder/bin/execute.js

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ const fieldIdToName = {
5757
managementApiEndpoint: "Management API hostname",
5858
apiVersion: "Management API version",
5959
openUrl: "Developer portal URL",
60+
configAdvancedTenantId: "Tenant ID",
61+
configAdvancedRedirectUri: "Redirect URI",
6062
};
6163
const prefixUrlProtocol = (value) => /https?:\/\//.test(value) ? value : `https://${value}`;
6264
const validateRequired = (name, msg = `The “${name}” parameter is required.`) => (input) => (input != null && input !== "") || msg;
@@ -102,6 +104,14 @@ const validateMiscConfig = {
102104
return true;
103105
return validateUrl(fieldIdToName.openUrl)(input);
104106
},
107+
configAdvancedTenantId: () => {
108+
return true;
109+
},
110+
configAdvancedRedirectUri: (input) => {
111+
if (!input)
112+
return true;
113+
return validateUrl(fieldIdToName.openUrl)(input);
114+
},
105115
};
106116
const promptWidgetConfig = (partial) => inquirer__default["default"].prompt([
107117
{
@@ -121,7 +131,7 @@ const promptWidgetConfig = (partial) => inquirer__default["default"].prompt([
121131
],
122132
},
123133
], partial);
124-
const promptDeployConfig = (partial) => inquirer__default["default"].prompt([
134+
const promptServiceInformation = (partial) => inquirer__default["default"].prompt([
125135
{
126136
name: "resourceId",
127137
type: "input",
@@ -158,6 +168,18 @@ const promptMiscConfig = (partial) => inquirer__default["default"].prompt([
158168
transformer: prefixUrlProtocol,
159169
validate: validateMiscConfig.openUrl,
160170
},
171+
{
172+
name: "configAdvancedTenantId",
173+
type: "input",
174+
message: fieldIdToName.configAdvancedTenantId + " to be used in Azure Identity InteractiveBrowserCredential class (optional)",
175+
validate: validateMiscConfig.openUrl,
176+
},
177+
{
178+
name: "configAdvancedRedirectUri",
179+
type: "input",
180+
message: fieldIdToName.configAdvancedRedirectUri + " to be used in Azure Identity InteractiveBrowserCredential class (optional; default is http://localhost:1337)",
181+
validate: validateMiscConfig.openUrl,
182+
},
161183
], partial);
162184

163185
class YError extends Error {
@@ -851,7 +873,7 @@ const templateSuffix = ".mustache";
851873
* @param options - JSON object with other data, which will not be stored in the DevPortal.
852874
*/
853875
async function generateProject(widgetConfig, deploymentConfig, options = {}) {
854-
const { openUrl } = options;
876+
const { openUrl, configAdvancedTenantId, configAdvancedRedirectUri } = options;
855877
const openUrlParsed = openUrl ? new URL(openUrl) : null;
856878
if (openUrlParsed) {
857879
openUrlParsed.searchParams.append(OVERRIDE_PORT_KEY, String(OVERRIDE_DEFAULT_PORT));
@@ -861,6 +883,13 @@ async function generateProject(widgetConfig, deploymentConfig, options = {}) {
861883
port: OVERRIDE_DEFAULT_PORT,
862884
open: openUrlParsed ? openUrlParsed.toString() : true,
863885
};
886+
const configAdditional = {
887+
interactiveBrowserCredentialOptions: { redirectUri: "http://localhost:1337" }
888+
};
889+
if (configAdvancedTenantId)
890+
configAdditional.interactiveBrowserCredentialOptions.tenantId = configAdvancedTenantId;
891+
if (configAdvancedRedirectUri)
892+
configAdditional.interactiveBrowserCredentialOptions.redirectUri = configAdvancedRedirectUri;
864893
const renderTemplate = async (file) => {
865894
const isTemplate = file.endsWith(templateSuffix);
866895
const encoding = file.endsWith(".ttf") ? "binary" : "utf8";
@@ -871,6 +900,7 @@ async function generateProject(widgetConfig, deploymentConfig, options = {}) {
871900
displayName: widgetConfig.displayName,
872901
config: JSON.stringify(Object.assign(Object.assign({}, widgetConfig), { name }), null, "\t"),
873902
configDeploy: JSON.stringify(deploymentConfig, null, "\t"),
903+
configAdditional: JSON.stringify(configAdditional, null, "\t"),
874904
serverSettings: JSON.stringify(serverSettings, null, "\t"),
875905
});
876906
}
@@ -905,23 +935,23 @@ async function main() {
905935
white("Specify the custom widget configuration.");
906936
const widgetConfig = await getConfig(promptWidgetConfig, validateWidgetConfig);
907937
white("Specify the Azure API Management service configuration.");
908-
const deployConfig = await getConfig(promptDeployConfig, validateDeployConfig);
938+
const serviceInformation = await getConfig(promptServiceInformation, validateDeployConfig);
909939
white("Specify other options");
910940
const miscConfig = await getConfig(promptMiscConfig, validateMiscConfig);
911-
if (deployConfig.resourceId[0] === "/") {
912-
deployConfig.resourceId = deployConfig.resourceId.slice(1);
941+
if (serviceInformation.resourceId[0] === "/") {
942+
serviceInformation.resourceId = serviceInformation.resourceId.slice(1);
913943
}
914-
if (deployConfig.resourceId.slice(-1) === "/") {
915-
deployConfig.resourceId = deployConfig.resourceId.slice(0, -1);
944+
if (serviceInformation.resourceId.slice(-1) === "/") {
945+
serviceInformation.resourceId = serviceInformation.resourceId.slice(0, -1);
916946
}
917-
if (deployConfig.apiVersion === "") {
918-
delete deployConfig.apiVersion;
947+
if (serviceInformation.apiVersion === "") {
948+
delete serviceInformation.apiVersion;
919949
}
920-
deployConfig.managementApiEndpoint = prefixUrlProtocol(deployConfig.managementApiEndpoint);
950+
serviceInformation.managementApiEndpoint = prefixUrlProtocol(serviceInformation.managementApiEndpoint);
921951
miscConfig.openUrl = miscConfig.openUrl
922952
? prefixUrlProtocol(miscConfig.openUrl)
923953
: miscConfig.openUrl;
924-
return generateProject(widgetConfig, deployConfig, miscConfig)
954+
return generateProject(widgetConfig, serviceInformation, miscConfig)
925955
.then(() => green("\nThe custom widget’s code scaffold has been successfully generated.\n"))
926956
.catch(console.error);
927957
}

sdk/apimanagement/api-management-custom-widgets-scaffolder/bin/templates/_shared/deploy.js.mustache

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ const {deployNodeJS} = require("@azure/api-management-custom-widgets-tools")
33
const serviceInformation = {{&configDeploy}}
44
const name = "{{name}}"
55
const fallbackConfigPath = "./static/config.msapim.json"
6+
const config = {{&configAdditional}}
67

7-
deployNodeJS(serviceInformation, name, fallbackConfigPath)
8+
deployNodeJS(serviceInformation, name, fallbackConfigPath, config)

sdk/apimanagement/api-management-custom-widgets-scaffolder/bin/templates/react/package.json.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"deploy": "npm run build && node deploy.js"
1111
},
1212
"dependencies": {
13-
"@azure/api-management-custom-widgets-tools": "^1.0.0-beta.1",
13+
"@azure/api-management-custom-widgets-tools": "^1.0.0-beta.2",
1414
"react": "^18.2.0",
1515
"react-dom": "^18.2.0"
1616
},

sdk/apimanagement/api-management-custom-widgets-scaffolder/bin/templates/react/src/providers.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ export const SecretsContext = React.createContext<Secrets>({
2020
userId: "",
2121
apiVersion: "",
2222
managementApiUrl: "",
23+
parentLocation: {
24+
host: "",
25+
hostname: "",
26+
href: "",
27+
origin: "",
28+
pathname: "",
29+
port: "",
30+
protocol: "",
31+
search: "",
32+
},
2333
})
2434
export const SecretsProvider: React.FC<{children?: React.ReactNode; targetModule: TargetModule}> = (
2535
{children, targetModule},

sdk/apimanagement/api-management-custom-widgets-scaffolder/bin/templates/typescript/package.json.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"deploy": "npm run build && node deploy.js"
1111
},
1212
"dependencies": {
13-
"@azure/api-management-custom-widgets-tools": "^1.0.0-beta.1"
13+
"@azure/api-management-custom-widgets-tools": "^1.0.0-beta.2"
1414
},
1515
"devDependencies": {
1616
"prettier": "^2.7.1",

sdk/apimanagement/api-management-custom-widgets-scaffolder/bin/templates/vue/package.json.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"deploy": "npm run build && node deploy.js"
1111
},
1212
"dependencies": {
13-
"@azure/api-management-custom-widgets-tools": "^1.0.0-beta.1",
13+
"@azure/api-management-custom-widgets-tools": "^1.0.0-beta.2",
1414
"vue": "^3.2.37"
1515
},
1616
"devDependencies": {

sdk/apimanagement/api-management-custom-widgets-scaffolder/review/api-management-custom-widgets-scaffolder.api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export function generateProject(widgetConfig: CustomWidgetCommonConfig, deployme
2626

2727
// @public
2828
export interface Options {
29+
configAdvancedRedirectUri?: string;
30+
configAdvancedTenantId?: string;
2931
openUrl?: string;
3032
}
3133

sdk/apimanagement/api-management-custom-widgets-scaffolder/src/bin/execute-configs.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
import { Configs, DeploymentConfig, Options, TECHNOLOGIES, WidgetConfig } from "../scaffolding";
4+
import { Configs, ServiceInformation, Options, TECHNOLOGIES, WidgetConfig } from "../scaffolding";
55

66
import inquirer from "inquirer";
77

88
export const fieldIdToName: Record<
9-
keyof (WidgetConfig & DeploymentConfig & Options) | string,
9+
keyof (WidgetConfig & ServiceInformation & Options) | string,
1010
string
1111
> = {
1212
displayName: "Widget display name",
@@ -19,6 +19,8 @@ export const fieldIdToName: Record<
1919
apiVersion: "Management API version",
2020

2121
openUrl: "Developer portal URL",
22+
configAdvancedTenantId: "Tenant ID",
23+
configAdvancedRedirectUri: "Redirect URI",
2224
};
2325

2426
export const prefixUrlProtocol = (value: string): string =>
@@ -70,7 +72,7 @@ export const validateWidgetConfig: Validate<WidgetConfig> = {
7072
},
7173
};
7274

73-
export const validateDeployConfig: Validate<DeploymentConfig> = {
75+
export const validateDeployConfig: Validate<ServiceInformation> = {
7476
resourceId: (input) => {
7577
const required = validateRequired(fieldIdToName.resourceId)(input);
7678
if (required !== true) return required;
@@ -89,6 +91,13 @@ export const validateMiscConfig: Validate<Options> = {
8991
if (!input) return true;
9092
return validateUrl(fieldIdToName.openUrl)(input);
9193
},
94+
configAdvancedTenantId: () => {
95+
return true;
96+
},
97+
configAdvancedRedirectUri: (input) => {
98+
if (!input) return true;
99+
return validateUrl(fieldIdToName.openUrl)(input);
100+
},
92101
};
93102

94103
export const promptWidgetConfig = (partial: Partial<WidgetConfig>): Promise<WidgetConfig> =>
@@ -114,7 +123,9 @@ export const promptWidgetConfig = (partial: Partial<WidgetConfig>): Promise<Widg
114123
partial
115124
);
116125

117-
export const promptDeployConfig = (partial: Partial<DeploymentConfig>): Promise<DeploymentConfig> =>
126+
export const promptServiceInformation = (
127+
partial: Partial<ServiceInformation>
128+
): Promise<ServiceInformation> =>
118129
inquirer.prompt(
119130
[
120131
{
@@ -159,6 +170,22 @@ export const promptMiscConfig = (partial: Partial<Options>): Promise<Options> =>
159170
transformer: prefixUrlProtocol,
160171
validate: validateMiscConfig.openUrl,
161172
},
173+
{
174+
name: "configAdvancedTenantId",
175+
type: "input",
176+
message:
177+
fieldIdToName.configAdvancedTenantId +
178+
" to be used in Azure Identity InteractiveBrowserCredential class (optional)",
179+
validate: validateMiscConfig.openUrl,
180+
},
181+
{
182+
name: "configAdvancedRedirectUri",
183+
type: "input",
184+
message:
185+
fieldIdToName.configAdvancedRedirectUri +
186+
" to be used in Azure Identity InteractiveBrowserCredential class (optional; default is http://localhost:1337)",
187+
validate: validateMiscConfig.openUrl,
188+
},
162189
],
163190
partial
164191
);

sdk/apimanagement/api-management-custom-widgets-scaffolder/src/bin/execute.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { Log, buildGetConfig } from "./execute-helpers";
77
import {
88
prefixUrlProtocol,
9-
promptDeployConfig,
9+
promptServiceInformation,
1010
promptMiscConfig,
1111
promptWidgetConfig,
1212
validateDeployConfig,
@@ -33,27 +33,29 @@ async function main(): Promise<void> {
3333
white("Specify the custom widget configuration.");
3434
const widgetConfig = await getConfig(promptWidgetConfig, validateWidgetConfig);
3535
white("Specify the Azure API Management service configuration.");
36-
const deployConfig = await getConfig(promptDeployConfig, validateDeployConfig);
36+
const serviceInformation = await getConfig(promptServiceInformation, validateDeployConfig);
3737
white("Specify other options");
3838
const miscConfig = await getConfig(promptMiscConfig, validateMiscConfig);
3939

40-
if (deployConfig.resourceId[0] === "/") {
41-
deployConfig.resourceId = deployConfig.resourceId.slice(1);
40+
if (serviceInformation.resourceId[0] === "/") {
41+
serviceInformation.resourceId = serviceInformation.resourceId.slice(1);
4242
}
43-
if (deployConfig.resourceId.slice(-1) === "/") {
44-
deployConfig.resourceId = deployConfig.resourceId.slice(0, -1);
43+
if (serviceInformation.resourceId.slice(-1) === "/") {
44+
serviceInformation.resourceId = serviceInformation.resourceId.slice(0, -1);
4545
}
46-
if (deployConfig.apiVersion === "") {
47-
delete deployConfig.apiVersion;
46+
if (serviceInformation.apiVersion === "") {
47+
delete serviceInformation.apiVersion;
4848
}
4949

50-
deployConfig.managementApiEndpoint = prefixUrlProtocol(deployConfig.managementApiEndpoint);
50+
serviceInformation.managementApiEndpoint = prefixUrlProtocol(
51+
serviceInformation.managementApiEndpoint
52+
);
5153

5254
miscConfig.openUrl = miscConfig.openUrl
5355
? prefixUrlProtocol(miscConfig.openUrl)
5456
: miscConfig.openUrl;
5557

56-
return generateProject(widgetConfig, deployConfig, miscConfig)
58+
return generateProject(widgetConfig, serviceInformation, miscConfig)
5759
.then(() => green("\nThe custom widget’s code scaffold has been successfully generated.\n"))
5860
.catch(console.error);
5961
}

0 commit comments

Comments
 (0)