@microsoft/managed-apps-cli 0.5.0 → 0.7.0
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/README.md +65 -24
- package/dist/ArgumentProvider.d.ts +10 -2
- package/dist/ArgumentProvider.d.ts.map +1 -1
- package/dist/ArgumentProvider.js +11 -2
- package/dist/ArgumentProvider.js.map +1 -1
- package/dist/Authentication/ActiveAccountStore.d.ts +24 -0
- package/dist/Authentication/ActiveAccountStore.d.ts.map +1 -0
- package/dist/Authentication/ActiveAccountStore.js +54 -0
- package/dist/Authentication/ActiveAccountStore.js.map +1 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.d.ts +26 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.js +31 -0
- package/dist/Authentication/EnvironmentVariableAuthenticationProvider.js.map +1 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts +57 -3
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
- package/dist/Authentication/NodeMsalAuthenticationProvider.js +187 -27
- package/dist/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +74 -23
- package/dist/Cli.js.map +1 -1
- package/dist/CliUtils.d.ts +2 -8
- package/dist/CliUtils.d.ts.map +1 -1
- package/dist/CliUtils.js.map +1 -1
- package/dist/Constants/CommandRegistry.d.ts.map +1 -1
- package/dist/Constants/CommandRegistry.js +32 -6
- package/dist/Constants/CommandRegistry.js.map +1 -1
- package/dist/Constants/HelpStrings.d.ts +39 -3
- package/dist/Constants/HelpStrings.d.ts.map +1 -1
- package/dist/Constants/HelpStrings.js +63 -10
- package/dist/Constants/HelpStrings.js.map +1 -1
- package/dist/Constants.d.ts +2 -0
- package/dist/Constants.d.ts.map +1 -1
- package/dist/Constants.js +2 -0
- package/dist/Constants.js.map +1 -1
- package/dist/Errors/GitHubErrorMap.d.ts +39 -0
- package/dist/Errors/GitHubErrorMap.d.ts.map +1 -0
- package/dist/Errors/GitHubErrorMap.js +187 -0
- package/dist/Errors/GitHubErrorMap.js.map +1 -0
- package/dist/HttpClient/CliHttpClient.d.ts +8 -3
- package/dist/HttpClient/CliHttpClient.d.ts.map +1 -1
- package/dist/HttpClient/CliHttpClient.js +33 -13
- package/dist/HttpClient/CliHttpClient.js.map +1 -1
- package/dist/Logger/ConsoleWriter.d.ts.map +1 -1
- package/dist/Logger/ConsoleWriter.js +7 -7
- package/dist/Logger/ConsoleWriter.js.map +1 -1
- package/dist/Middletier/FunctionsBundler.d.ts +17 -0
- package/dist/Middletier/FunctionsBundler.d.ts.map +1 -0
- package/dist/Middletier/FunctionsBundler.js +165 -0
- package/dist/Middletier/FunctionsBundler.js.map +1 -0
- package/dist/Middletier/PackFunctions.d.ts +52 -0
- package/dist/Middletier/PackFunctions.d.ts.map +1 -0
- package/dist/Middletier/PackFunctions.js +122 -0
- package/dist/Middletier/PackFunctions.js.map +1 -0
- package/dist/Types/Cli.types.d.ts +42 -1
- package/dist/Types/Cli.types.d.ts.map +1 -1
- package/dist/Types/Command.types.d.ts +1 -1
- package/dist/Types/Command.types.d.ts.map +1 -1
- package/dist/Utils/ConsoleOutput.d.ts +6 -0
- package/dist/Utils/ConsoleOutput.d.ts.map +1 -1
- package/dist/Utils/ConsoleOutput.js +23 -12
- package/dist/Utils/ConsoleOutput.js.map +1 -1
- package/dist/Utils/EnvVars.d.ts +1 -1
- package/dist/Utils/EnvVars.d.ts.map +1 -1
- package/dist/Utils/EnvVars.js.map +1 -1
- package/dist/Utils/EnvironmentRoutingUtils.d.ts +8 -0
- package/dist/Utils/EnvironmentRoutingUtils.d.ts.map +1 -0
- package/dist/Utils/EnvironmentRoutingUtils.js +45 -0
- package/dist/Utils/EnvironmentRoutingUtils.js.map +1 -0
- package/dist/Utils/GitHubDcfFlow.d.ts +59 -0
- package/dist/Utils/GitHubDcfFlow.d.ts.map +1 -0
- package/dist/Utils/GitHubDcfFlow.js +165 -0
- package/dist/Utils/GitHubDcfFlow.js.map +1 -0
- package/dist/Utils/GitUtils.d.ts +5 -0
- package/dist/Utils/GitUtils.d.ts.map +1 -1
- package/dist/Utils/GitUtils.js +15 -0
- package/dist/Utils/GitUtils.js.map +1 -1
- package/dist/Utils/Paging.d.ts.map +1 -1
- package/dist/Utils/Paging.js +4 -4
- package/dist/Utils/Paging.js.map +1 -1
- package/dist/Utils/RepoUrl.d.ts +13 -0
- package/dist/Utils/RepoUrl.d.ts.map +1 -0
- package/dist/Utils/RepoUrl.js +6 -0
- package/dist/Utils/RepoUrl.js.map +1 -0
- package/dist/Utils/Spinner.d.ts +9 -1
- package/dist/Utils/Spinner.d.ts.map +1 -1
- package/dist/Utils/Spinner.js +25 -5
- package/dist/Utils/Spinner.js.map +1 -1
- package/dist/Verbs/AddAction.d.ts.map +1 -1
- package/dist/Verbs/AddAction.js +12 -41
- package/dist/Verbs/AddAction.js.map +1 -1
- package/dist/Verbs/AddConnector.d.ts +24 -0
- package/dist/Verbs/AddConnector.d.ts.map +1 -0
- package/dist/Verbs/AddConnector.js +156 -0
- package/dist/Verbs/AddConnector.js.map +1 -0
- package/dist/Verbs/AddConnectorFlows.d.ts +72 -0
- package/dist/Verbs/AddConnectorFlows.d.ts.map +1 -0
- package/dist/Verbs/AddConnectorFlows.js +198 -0
- package/dist/Verbs/AddConnectorFlows.js.map +1 -0
- package/dist/Verbs/AddDataSource.js +1 -1
- package/dist/Verbs/AddDataSource.js.map +1 -1
- package/dist/Verbs/AddFlow.d.ts.map +1 -1
- package/dist/Verbs/AddFlow.js +3 -2
- package/dist/Verbs/AddFlow.js.map +1 -1
- package/dist/Verbs/AddTable.d.ts.map +1 -1
- package/dist/Verbs/AddTable.js +15 -100
- package/dist/Verbs/AddTable.js.map +1 -1
- package/dist/Verbs/AuthStatus.d.ts.map +1 -1
- package/dist/Verbs/AuthStatus.js +34 -6
- package/dist/Verbs/AuthStatus.js.map +1 -1
- package/dist/Verbs/AuthSwitch.d.ts +6 -0
- package/dist/Verbs/AuthSwitch.d.ts.map +1 -0
- package/dist/Verbs/AuthSwitch.js +67 -0
- package/dist/Verbs/AuthSwitch.js.map +1 -0
- package/dist/Verbs/ConnectorHelpers.d.ts +54 -1
- package/dist/Verbs/ConnectorHelpers.d.ts.map +1 -1
- package/dist/Verbs/ConnectorHelpers.js +217 -16
- package/dist/Verbs/ConnectorHelpers.js.map +1 -1
- package/dist/Verbs/CreateMaafApp.d.ts +26 -1
- package/dist/Verbs/CreateMaafApp.d.ts.map +1 -1
- package/dist/Verbs/CreateMaafApp.js +310 -135
- package/dist/Verbs/CreateMaafApp.js.map +1 -1
- package/dist/Verbs/DeployMaafApp.d.ts.map +1 -1
- package/dist/Verbs/DeployMaafApp.js +4 -0
- package/dist/Verbs/DeployMaafApp.js.map +1 -1
- package/dist/Verbs/Dev.js +5 -5
- package/dist/Verbs/Dev.js.map +1 -1
- package/dist/Verbs/FindDataverseApi.js +15 -15
- package/dist/Verbs/FindDataverseApi.js.map +1 -1
- package/dist/Verbs/GetSettings.d.ts +1 -1
- package/dist/Verbs/GetSettings.js +1 -1
- package/dist/Verbs/Init.d.ts.map +1 -1
- package/dist/Verbs/Init.js +129 -61
- package/dist/Verbs/Init.js.map +1 -1
- package/dist/Verbs/ListConnectors.d.ts.map +1 -1
- package/dist/Verbs/ListConnectors.js +4 -2
- package/dist/Verbs/ListConnectors.js.map +1 -1
- package/dist/Verbs/ListDatasets.d.ts.map +1 -1
- package/dist/Verbs/ListDatasets.js +5 -0
- package/dist/Verbs/ListDatasets.js.map +1 -1
- package/dist/Verbs/ListSqlStoredProcedures.d.ts.map +1 -1
- package/dist/Verbs/ListSqlStoredProcedures.js +5 -0
- package/dist/Verbs/ListSqlStoredProcedures.js.map +1 -1
- package/dist/Verbs/ListTables.d.ts.map +1 -1
- package/dist/Verbs/ListTables.js +5 -0
- package/dist/Verbs/ListTables.js.map +1 -1
- package/dist/Verbs/Login.d.ts.map +1 -1
- package/dist/Verbs/Login.js +16 -13
- package/dist/Verbs/Login.js.map +1 -1
- package/dist/Verbs/Logout.d.ts.map +1 -1
- package/dist/Verbs/Logout.js +19 -13
- package/dist/Verbs/Logout.js.map +1 -1
- package/dist/Verbs/MaafAppPermissions.d.ts +26 -6
- package/dist/Verbs/MaafAppPermissions.d.ts.map +1 -1
- package/dist/Verbs/MaafAppPermissions.js +193 -28
- package/dist/Verbs/MaafAppPermissions.js.map +1 -1
- package/dist/Verbs/Pack.d.ts +6 -6
- package/dist/Verbs/Pack.d.ts.map +1 -1
- package/dist/Verbs/Pack.js +80 -12
- package/dist/Verbs/Pack.js.map +1 -1
- package/dist/Verbs/RefreshDataSource.d.ts.map +1 -1
- package/dist/Verbs/RefreshDataSource.js +4 -3
- package/dist/Verbs/RefreshDataSource.js.map +1 -1
- package/dist/Verbs/RefreshGitAuth.d.ts +6 -0
- package/dist/Verbs/RefreshGitAuth.d.ts.map +1 -0
- package/dist/Verbs/RefreshGitAuth.js +153 -0
- package/dist/Verbs/RefreshGitAuth.js.map +1 -0
- package/dist/Verbs/RemoveFlow.d.ts.map +1 -1
- package/dist/Verbs/RemoveFlow.js +4 -3
- package/dist/Verbs/RemoveFlow.js.map +1 -1
- package/dist/Verbs/SetSetting.d.ts +1 -1
- package/dist/Verbs/SetSetting.js +1 -1
- package/dist/Verbs/VerbConstants.d.ts +72 -16
- package/dist/Verbs/VerbConstants.d.ts.map +1 -1
- package/dist/Verbs/VerbConstants.js +64 -16
- package/dist/Verbs/VerbConstants.js.map +1 -1
- package/dist/Verbs/index.d.ts +3 -0
- package/dist/Verbs/index.d.ts.map +1 -1
- package/dist/Verbs/index.js +3 -0
- package/dist/Verbs/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/Authentication/OrchardAuthenticationProvider.d.ts +0 -13
- package/dist/Authentication/OrchardAuthenticationProvider.d.ts.map +0 -1
- package/dist/Authentication/OrchardAuthenticationProvider.js +0 -30
- package/dist/Authentication/OrchardAuthenticationProvider.js.map +0 -1
- package/dist/HttpClient/OrchardProxy.d.ts +0 -11
- package/dist/HttpClient/OrchardProxy.d.ts.map +0 -1
- package/dist/HttpClient/OrchardProxy.js +0 -25
- package/dist/HttpClient/OrchardProxy.js.map +0 -1
- package/dist/HttpClient/Proxy.d.ts +0 -7
- package/dist/HttpClient/Proxy.d.ts.map +0 -1
- package/dist/HttpClient/Proxy.js +0 -5
- package/dist/HttpClient/Proxy.js.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import type { Api } from '@microsoft/managed-apps-actions';
|
|
4
|
+
import type { Api, EffectiveConnectorDataPolicy } from '@microsoft/managed-apps-actions';
|
|
5
|
+
import type { Region } from '@microsoft/managed-apps-common/services';
|
|
5
6
|
import type { ArgumentProvider } from '../ArgumentProvider.js';
|
|
6
7
|
/**
|
|
7
8
|
* Preflight step shared by `app add action` and `app add table`. Fetches the
|
|
@@ -22,6 +23,7 @@ import type { ArgumentProvider } from '../ArgumentProvider.js';
|
|
|
22
23
|
export declare function runConnectorDlpPreflightAsync(argumentProvider: ArgumentProvider, apiId: string): Promise<{
|
|
23
24
|
connector: Api;
|
|
24
25
|
tenantId: string | undefined;
|
|
26
|
+
policy: EffectiveConnectorDataPolicy;
|
|
25
27
|
}>;
|
|
26
28
|
/**
|
|
27
29
|
* Resolves a connection for a connector. In interactive mode, lists the
|
|
@@ -34,4 +36,55 @@ export declare function resolveConnectionInteractivelyAsync(options: {
|
|
|
34
36
|
apiId: string;
|
|
35
37
|
connector: Api;
|
|
36
38
|
}): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Best-effort request that the calling application be added to a connection's
|
|
41
|
+
* API Hubs ACL via the Power Platform user-consent endpoint. The server reads
|
|
42
|
+
* the calling app's `appid` from the bearer token, and the gateway resolves
|
|
43
|
+
* tenant + environment from the auth context and its routing config — so the
|
|
44
|
+
* CLI only needs to supply connector + connection identifiers, no body.
|
|
45
|
+
*
|
|
46
|
+
* Gating: requires the opt-in feature flag
|
|
47
|
+
* `MS_CLI_ENABLE_CONNECTOR_USER_CONSENT=true` (off by default while the
|
|
48
|
+
* consent endpoint is rolling out). When the flag is unset, the call is
|
|
49
|
+
* silently skipped — no warning, no telemetry, no HTTP traffic.
|
|
50
|
+
*
|
|
51
|
+
* Failure modes:
|
|
52
|
+
* - HTTP 403: emits a permission-specific warning explaining that the tenant
|
|
53
|
+
* admin must grant the calling app the
|
|
54
|
+
* `Connectivity.Connections.UserConsent` delegated permission, then returns.
|
|
55
|
+
* - Any other HTTP / network error: surfaces a generic warning and returns.
|
|
56
|
+
* The underlying `ConnectivityService` already records its own
|
|
57
|
+
* `scenario.failure` telemetry, so this helper doesn't re-emit a duplicate
|
|
58
|
+
* error event.
|
|
59
|
+
*
|
|
60
|
+
* Silent on success: a 200 OK does not guarantee the ACL was modified (the
|
|
61
|
+
* server has feature-gated silent-skip paths), so the success path emits no
|
|
62
|
+
* user-facing message.
|
|
63
|
+
*
|
|
64
|
+
* Never throws.
|
|
65
|
+
*/
|
|
66
|
+
export declare function requestCliUserConsentAsync(opts: {
|
|
67
|
+
apiId: string;
|
|
68
|
+
connectionId: string;
|
|
69
|
+
}): Promise<void>;
|
|
70
|
+
type ConnectionServerConfig = {
|
|
71
|
+
connectorName: string;
|
|
72
|
+
environmentId: string;
|
|
73
|
+
region: Region;
|
|
74
|
+
};
|
|
75
|
+
type ConnectionResult = {
|
|
76
|
+
status: 'created' | 'cancelled' | 'error';
|
|
77
|
+
connectionId?: string;
|
|
78
|
+
connectionName?: string;
|
|
79
|
+
displayName?: string;
|
|
80
|
+
errorMessage?: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Starts a local HTTP server, opens the maaf-player connection page in the
|
|
84
|
+
* browser, and waits for a callback with the result. Uses the same pattern
|
|
85
|
+
* as an OAuth authorization code flow: nonce for CSRF, protocol version for
|
|
86
|
+
* drift detection, and a timeout for cleanup.
|
|
87
|
+
*/
|
|
88
|
+
export declare function startConnectionServerAsync(config: ConnectionServerConfig): Promise<ConnectionResult>;
|
|
89
|
+
export {};
|
|
37
90
|
//# sourceMappingURL=ConnectorHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectorHelpers.d.ts","sourceRoot":"","sources":["../../src/Verbs/ConnectorHelpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"ConnectorHelpers.d.ts","sourceRoot":"","sources":["../../src/Verbs/ConnectorHelpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAUzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AAKtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAiB5D;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,6BAA6B,CACjD,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IACT,SAAS,EAAE,GAAG,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,4BAA4B,CAAC;CACtC,CAAC,CA6CD;AAED;;;;;GAKG;AACH,wBAAsB,mCAAmC,CAAC,OAAO,EAAE;IACjE,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,GAAG,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4FlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BhB;AAMD,KAAK,sBAAsB,GAAG;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAqH3B"}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
3
|
*/
|
|
4
|
-
import { createConnectionAsync, getConnectorAsync, getEffectiveConnectorDataPolicyAsync, getPlayerServiceConfig, listConnectionsForConnectorAsync, } from '@microsoft/managed-apps-actions';
|
|
4
|
+
import { createConnectionAsync, getConnectorAsync, getEffectiveConnectorDataPolicyAsync, getPlayerServiceConfig, isSsoOnlyConnector, listConnectionsForConnectorAsync, requestConnectionUserConsentAsync, } from '@microsoft/managed-apps-actions';
|
|
5
|
+
import { createMaafConnectionUrl, HttpClientError } from '@microsoft/managed-apps-common/services';
|
|
6
|
+
import * as http from 'http';
|
|
7
|
+
import open from 'open';
|
|
5
8
|
import { getCliLogger, getSettings } from '../CliSettings.js';
|
|
6
9
|
import { promptSelect } from '../CliUtils.js';
|
|
7
10
|
import { CLI_BINARY_NAME } from '../Constants/CliConstants.js';
|
|
8
|
-
import { NotFoundError, UsageError } from '../Errors/CliError.js';
|
|
9
|
-
import { printTable, printWarning } from '../Utils/ConsoleOutput.js';
|
|
11
|
+
import { AppError, NotFoundError, UsageError } from '../Errors/CliError.js';
|
|
12
|
+
import { printInfo, printSuccess, printTable, printWarning } from '../Utils/ConsoleOutput.js';
|
|
13
|
+
import { getCliEnvVarBool } from '../Utils/EnvVars.js';
|
|
10
14
|
const ALLOW_ALL_POLICY = {
|
|
11
15
|
defaultBehavior: 'Allow',
|
|
12
16
|
allowedConnectors: [],
|
|
13
17
|
};
|
|
14
18
|
const CREATE_NEW_CONNECTION = '__create__';
|
|
19
|
+
const CONNECTION_CREATION_TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes
|
|
20
|
+
const PROTOCOL_VERSION = '1';
|
|
15
21
|
/**
|
|
16
22
|
* Preflight step shared by `app add action` and `app add table`. Fetches the
|
|
17
23
|
* connector and effective DLP policy in parallel, then enforces the policy.
|
|
@@ -57,7 +63,7 @@ export async function runConnectorDlpPreflightAsync(argumentProvider, apiId) {
|
|
|
57
63
|
if (isBlocked) {
|
|
58
64
|
throw new UsageError(`Connector '${connector.properties.displayName ?? apiId}' is blocked by your organization's DLP policy.`);
|
|
59
65
|
}
|
|
60
|
-
return { connector, tenantId };
|
|
66
|
+
return { connector, tenantId, policy };
|
|
61
67
|
}
|
|
62
68
|
/**
|
|
63
69
|
* Resolves a connection for a connector. In interactive mode, lists the
|
|
@@ -96,21 +102,216 @@ export async function resolveConnectionInteractivelyAsync(options) {
|
|
|
96
102
|
options: choices,
|
|
97
103
|
});
|
|
98
104
|
if (selected === CREATE_NEW_CONNECTION) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
105
|
+
// Only attempt SSO when the connector has a single auth type that is SSO-eligible.
|
|
106
|
+
// Connectors with multiple auth types need the browser flow so the user can choose.
|
|
107
|
+
if (isSsoOnlyConnector(connector)) {
|
|
108
|
+
try {
|
|
109
|
+
const newConnection = await createConnectionAsync({
|
|
110
|
+
vfs: cliFs,
|
|
111
|
+
authProvider,
|
|
112
|
+
region: playerServiceConfig.region,
|
|
113
|
+
environmentName: playerServiceConfig.environmentName,
|
|
114
|
+
actionsParams: { connectorId: apiId },
|
|
115
|
+
localFilePaths: {
|
|
116
|
+
appConfigPath: fileConfig.appConfigPath,
|
|
117
|
+
schemaPath: fileConfig.schemaPath,
|
|
118
|
+
codeGenPath: fileConfig.codeGenPath,
|
|
119
|
+
},
|
|
120
|
+
logger,
|
|
121
|
+
});
|
|
122
|
+
return newConnection.name;
|
|
123
|
+
}
|
|
124
|
+
catch (ssoError) {
|
|
125
|
+
printWarning(`Silent connection creation failed: ${ssoError instanceof Error ? ssoError.message : String(ssoError)}`);
|
|
126
|
+
printInfo('Falling back to browser-based connection creation...\n');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
printInfo('This connector requires manual interaction. Opening browser for connection creation...\n');
|
|
131
|
+
}
|
|
132
|
+
// Browser-based fallback: open the maaf-player connection dialog
|
|
133
|
+
const connectorName = apiId.startsWith('shared_') ? apiId : `shared_${apiId}`;
|
|
134
|
+
const result = await startConnectionServerAsync({
|
|
135
|
+
connectorName,
|
|
136
|
+
environmentId: playerServiceConfig.environmentName,
|
|
102
137
|
region: playerServiceConfig.region,
|
|
103
|
-
environmentName: playerServiceConfig.environmentName,
|
|
104
|
-
actionsParams: { connectorId: apiId },
|
|
105
|
-
localFilePaths: {
|
|
106
|
-
appConfigPath: fileConfig.appConfigPath,
|
|
107
|
-
schemaPath: fileConfig.schemaPath,
|
|
108
|
-
codeGenPath: fileConfig.codeGenPath,
|
|
109
|
-
},
|
|
110
|
-
logger,
|
|
111
138
|
});
|
|
112
|
-
|
|
139
|
+
if (result.status === 'created' && result.connectionName) {
|
|
140
|
+
printSuccess('Connection created successfully!');
|
|
141
|
+
if (result.displayName) {
|
|
142
|
+
printInfo(` Display Name: ${result.displayName}`);
|
|
143
|
+
}
|
|
144
|
+
printInfo(` Connection ID: ${result.connectionName}`);
|
|
145
|
+
return result.connectionName;
|
|
146
|
+
}
|
|
147
|
+
else if (result.status === 'error') {
|
|
148
|
+
throw new AppError(result.errorMessage ?? 'Connection creation failed in the browser.');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
throw new UsageError('Connection creation was cancelled.');
|
|
152
|
+
}
|
|
113
153
|
}
|
|
114
154
|
return selected;
|
|
115
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Best-effort request that the calling application be added to a connection's
|
|
158
|
+
* API Hubs ACL via the Power Platform user-consent endpoint. The server reads
|
|
159
|
+
* the calling app's `appid` from the bearer token, and the gateway resolves
|
|
160
|
+
* tenant + environment from the auth context and its routing config — so the
|
|
161
|
+
* CLI only needs to supply connector + connection identifiers, no body.
|
|
162
|
+
*
|
|
163
|
+
* Gating: requires the opt-in feature flag
|
|
164
|
+
* `MS_CLI_ENABLE_CONNECTOR_USER_CONSENT=true` (off by default while the
|
|
165
|
+
* consent endpoint is rolling out). When the flag is unset, the call is
|
|
166
|
+
* silently skipped — no warning, no telemetry, no HTTP traffic.
|
|
167
|
+
*
|
|
168
|
+
* Failure modes:
|
|
169
|
+
* - HTTP 403: emits a permission-specific warning explaining that the tenant
|
|
170
|
+
* admin must grant the calling app the
|
|
171
|
+
* `Connectivity.Connections.UserConsent` delegated permission, then returns.
|
|
172
|
+
* - Any other HTTP / network error: surfaces a generic warning and returns.
|
|
173
|
+
* The underlying `ConnectivityService` already records its own
|
|
174
|
+
* `scenario.failure` telemetry, so this helper doesn't re-emit a duplicate
|
|
175
|
+
* error event.
|
|
176
|
+
*
|
|
177
|
+
* Silent on success: a 200 OK does not guarantee the ACL was modified (the
|
|
178
|
+
* server has feature-gated silent-skip paths), so the success path emits no
|
|
179
|
+
* user-facing message.
|
|
180
|
+
*
|
|
181
|
+
* Never throws.
|
|
182
|
+
*/
|
|
183
|
+
export async function requestCliUserConsentAsync(opts) {
|
|
184
|
+
if (!getCliEnvVarBool('ENABLE_CONNECTOR_USER_CONSENT')) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const { apiId, connectionId } = opts;
|
|
188
|
+
const logger = getCliLogger();
|
|
189
|
+
const scenario = logger.trackScenario('ConnectorUserConsent', { apiId, connectionId });
|
|
190
|
+
try {
|
|
191
|
+
await requestConnectionUserConsentAsync(apiId, connectionId, logger);
|
|
192
|
+
scenario.complete();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (error instanceof HttpClientError && error.status === 403) {
|
|
196
|
+
scenario.failure(error);
|
|
197
|
+
printWarning(`Could not request user consent on connection '${connectionId}' (HTTP 403). ` +
|
|
198
|
+
`The data source was added, but later calls against this connection may fail until ` +
|
|
199
|
+
`your tenant admin grants the calling application the ` +
|
|
200
|
+
`'Connectivity.Connections.UserConsent' delegated permission.`);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
scenario.failure(error);
|
|
204
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
205
|
+
printWarning(`Could not request user consent on connection '${connectionId}': ${message}. ` +
|
|
206
|
+
`The data source was added, but later calls against this connection may fail.`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Starts a local HTTP server, opens the maaf-player connection page in the
|
|
211
|
+
* browser, and waits for a callback with the result. Uses the same pattern
|
|
212
|
+
* as an OAuth authorization code flow: nonce for CSRF, protocol version for
|
|
213
|
+
* drift detection, and a timeout for cleanup.
|
|
214
|
+
*/
|
|
215
|
+
export async function startConnectionServerAsync(config) {
|
|
216
|
+
const { connectorName, environmentId, region } = config;
|
|
217
|
+
const nonce = crypto.randomUUID();
|
|
218
|
+
return new Promise((resolve, reject) => {
|
|
219
|
+
const server = http.createServer((req, res) => {
|
|
220
|
+
const url = new URL(req.url ?? '/', `http://localhost`);
|
|
221
|
+
if (url.pathname === '/callback' && req.method === 'GET') {
|
|
222
|
+
const queryNonce = url.searchParams.get('nonce');
|
|
223
|
+
if (queryNonce !== nonce) {
|
|
224
|
+
res.writeHead(403, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
225
|
+
res.end('<html><body><h2>Connection request verification failed. Please run the CLI command again.</h2></body></html>');
|
|
226
|
+
cleanup();
|
|
227
|
+
resolve({ status: 'cancelled' });
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const callbackVersion = url.searchParams.get('v');
|
|
231
|
+
if (callbackVersion !== PROTOCOL_VERSION) {
|
|
232
|
+
printWarning(`Warning: callback protocol version mismatch (expected ${PROTOCOL_VERSION}, got ${callbackVersion ?? 'none'}). Update the CLI to the latest version.`);
|
|
233
|
+
}
|
|
234
|
+
const status = url.searchParams.get('status');
|
|
235
|
+
const errorMessage = url.searchParams.get('message') ?? undefined;
|
|
236
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
237
|
+
let tabHtml;
|
|
238
|
+
if (status === 'created') {
|
|
239
|
+
tabHtml =
|
|
240
|
+
'<html><body><h2>Connection created! You can close this tab.</h2></body></html>';
|
|
241
|
+
}
|
|
242
|
+
else if (status === 'error') {
|
|
243
|
+
const safeMessage = errorMessage
|
|
244
|
+
? errorMessage.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`)
|
|
245
|
+
: '';
|
|
246
|
+
tabHtml = safeMessage
|
|
247
|
+
? `<html><body><h2>Connection creation failed. You can close this tab.</h2><p>${safeMessage}</p></body></html>`
|
|
248
|
+
: '<html><body><h2>Connection creation failed. You can close this tab.</h2></body></html>';
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
tabHtml =
|
|
252
|
+
'<html><body><h2>Connection creation cancelled. You can close this tab.</h2></body></html>';
|
|
253
|
+
}
|
|
254
|
+
res.end(tabHtml);
|
|
255
|
+
cleanup();
|
|
256
|
+
if (status === 'created') {
|
|
257
|
+
resolve({
|
|
258
|
+
status: 'created',
|
|
259
|
+
connectionId: url.searchParams.get('connectionId') ?? undefined,
|
|
260
|
+
connectionName: url.searchParams.get('connectionName') ?? undefined,
|
|
261
|
+
displayName: url.searchParams.get('displayName') ?? undefined,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
else if (status === 'error') {
|
|
265
|
+
resolve({ status: 'error', errorMessage });
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
resolve({ status: 'cancelled' });
|
|
269
|
+
}
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
res.writeHead(404);
|
|
273
|
+
res.end('Not found');
|
|
274
|
+
});
|
|
275
|
+
// Listen on port 0 to let the OS assign an available port
|
|
276
|
+
server.listen(0, 'localhost', async () => {
|
|
277
|
+
const address = server.address();
|
|
278
|
+
const port = typeof address === 'object' && address ? address.port : 0;
|
|
279
|
+
const callbackUrl = `http://localhost:${port}/callback`;
|
|
280
|
+
const playerUrl = createMaafConnectionUrl(region, environmentId, {
|
|
281
|
+
connector: connectorName,
|
|
282
|
+
callbackUrl,
|
|
283
|
+
nonce,
|
|
284
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
285
|
+
});
|
|
286
|
+
printInfo(`Opening browser at ${playerUrl}`);
|
|
287
|
+
try {
|
|
288
|
+
await open(playerUrl, { wait: false });
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
printInfo(`Could not open browser automatically. Please navigate to:\n ${playerUrl}`);
|
|
292
|
+
}
|
|
293
|
+
printInfo('Waiting for connection creation... (press Ctrl+C to cancel)\n');
|
|
294
|
+
});
|
|
295
|
+
server.on('error', (error) => {
|
|
296
|
+
cleanup();
|
|
297
|
+
reject(error);
|
|
298
|
+
});
|
|
299
|
+
const timeoutId = setTimeout(() => {
|
|
300
|
+
printInfo('\nConnection creation timed out after 10 minutes.');
|
|
301
|
+
cleanup();
|
|
302
|
+
resolve({ status: 'cancelled' });
|
|
303
|
+
}, CONNECTION_CREATION_TIMEOUT_MS);
|
|
304
|
+
const sigintHandler = () => {
|
|
305
|
+
printInfo('\nCancelling...');
|
|
306
|
+
cleanup();
|
|
307
|
+
resolve({ status: 'cancelled' });
|
|
308
|
+
};
|
|
309
|
+
function cleanup() {
|
|
310
|
+
clearTimeout(timeoutId);
|
|
311
|
+
process.off('SIGINT', sigintHandler);
|
|
312
|
+
server.close();
|
|
313
|
+
}
|
|
314
|
+
process.on('SIGINT', sigintHandler);
|
|
315
|
+
});
|
|
316
|
+
}
|
|
116
317
|
//# sourceMappingURL=ConnectorHelpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectorHelpers.js","sourceRoot":"","sources":["../../src/Verbs/ConnectorHelpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,oCAAoC,EACpC,sBAAsB,EACtB,gCAAgC,
|
|
1
|
+
{"version":3,"file":"ConnectorHelpers.js","sourceRoot":"","sources":["../../src/Verbs/ConnectorHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { type RepoType } from '@microsoft/managed-apps-common/config';
|
|
5
5
|
import type { ArgumentProvider } from '../ArgumentProvider.js';
|
|
6
|
+
/**
|
|
7
|
+
* Result of parsing the `--repo` flag value.
|
|
8
|
+
*
|
|
9
|
+
* - `native` (default): MAAF auto-provisions a platform-managed git repo, no remote URL.
|
|
10
|
+
* - `none`: source-control-free; no platform-managed repo, no remote URL.
|
|
11
|
+
* - `github`: bound to an external GitHub Enterprise repo at `remoteUrl`.
|
|
12
|
+
*
|
|
13
|
+
* `remoteUrl` is populated only when `repoType === 'github'`. This is a flat
|
|
14
|
+
* interface (not a discriminated union), so `if (repoType === 'github')` does NOT
|
|
15
|
+
* auto-narrow `remoteUrl` to `string`; github-branch use sites assert `remoteUrl!`.
|
|
16
|
+
*/
|
|
6
17
|
interface RepoSelection {
|
|
7
18
|
repoType: RepoType;
|
|
8
19
|
remoteUrl: string | undefined;
|
|
@@ -13,8 +24,23 @@ interface RepoSelection {
|
|
|
13
24
|
* - `none` (case-insensitive) → `none` (no GRS, no local setup)
|
|
14
25
|
* - any other non-empty value → `github` (external GHE binding, value flows through as
|
|
15
26
|
* `remoteUrl` to the action and the eventual git clone)
|
|
27
|
+
*
|
|
28
|
+
* Runtime invariant: `remoteUrl` is set iff `repoType === 'github'`. Consumers
|
|
29
|
+
* branch on `repoType` and assert `remoteUrl!` at github use sites — see
|
|
30
|
+
* `RepoSelection` for why narrowing is not automatic.
|
|
16
31
|
*/
|
|
17
32
|
export declare function parseRepoOption(rawRepoValue: string | undefined): RepoSelection;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a new MAAF app and (where applicable) sets up local source control.
|
|
35
|
+
*
|
|
36
|
+
* Three repo flows, selected by `--repo`:
|
|
37
|
+
* - `native` (default): server auto-provisions a GRS repo; local clone happens via GCM.
|
|
38
|
+
* - `github`: external GHE Cloud binding. Clones the user's repo locally. On the first
|
|
39
|
+
* `createAsync` call, a missing/expired server-side GitHub identity mapping is
|
|
40
|
+
* recoverable in-band: a single inline DCF run + exactly one `createAsync` retry.
|
|
41
|
+
* Any other error — or a second mapping failure after DCF — is a hard fail.
|
|
42
|
+
* - `none`: no git binding at all (just the server record + template + ms.config.json).
|
|
43
|
+
*/
|
|
18
44
|
export declare function createMaafAppAsync(argumentProvider: ArgumentProvider): Promise<void>;
|
|
19
45
|
interface CloneRepoOptions {
|
|
20
46
|
directory: string;
|
|
@@ -52,7 +78,6 @@ export declare function ensureGitInstalled(): void;
|
|
|
52
78
|
export declare function ensureTemplateSourceValid(source: string): void;
|
|
53
79
|
export declare function ensureTargetDirectoryEmpty(appDir: string): void;
|
|
54
80
|
export declare function ensureRepoTargetDirectoryEmpty(appDir: string): void;
|
|
55
|
-
export declare function ensureNoExistingConfig(appDir: string): void;
|
|
56
81
|
export declare function ensureTargetDirectoryWritable(appDir: string): void;
|
|
57
82
|
export {};
|
|
58
83
|
//# sourceMappingURL=CreateMaafApp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateMaafApp.d.ts","sourceRoot":"","sources":["../../src/Verbs/CreateMaafApp.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"CreateMaafApp.d.ts","sourceRoot":"","sources":["../../src/Verbs/CreateMaafApp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAOzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAgC5D;;;;;;;;;;GAUG;AACH,UAAU,aAAa;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAQ/E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmZ1F;AAED,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAYxE;AAED,UAAU,oBAAoB;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,MAAM,EACN,cAAc,EACd,YAAY,EACZ,QAAgB,GACjB,EAAE,oBAAoB,GAAG,IAAI,CA4E7B;AASD,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAM/F;AAQD,wBAAgB,kBAAkB,IAAI,IAAI,CAQzC;AA2DD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA2B9D;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAc/D;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAanE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BlE"}
|