@microsoft/managed-apps-cli 0.6.1 → 0.8.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 +56 -10
- package/dist/ArgumentProvider.d.ts +21 -2
- package/dist/ArgumentProvider.d.ts.map +1 -1
- package/dist/ArgumentProvider.js +47 -3
- 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/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 +8 -2
- package/dist/Cli.js.map +1 -1
- package/dist/CliSettings.d.ts.map +1 -1
- package/dist/CliSettings.js +1 -2
- package/dist/CliSettings.js.map +1 -1
- package/dist/CliUtils.d.ts +2 -1
- package/dist/CliUtils.d.ts.map +1 -1
- package/dist/CliUtils.js +4 -0
- package/dist/CliUtils.js.map +1 -1
- package/dist/Constants/CommandRegistry.d.ts.map +1 -1
- package/dist/Constants/CommandRegistry.js +44 -6
- package/dist/Constants/CommandRegistry.js.map +1 -1
- package/dist/Constants/HelpStrings.d.ts +75 -3
- package/dist/Constants/HelpStrings.d.ts.map +1 -1
- package/dist/Constants/HelpStrings.js +143 -41
- package/dist/Constants/HelpStrings.js.map +1 -1
- package/dist/Errors/GitHubErrorMap.d.ts +3 -3
- package/dist/Errors/GitHubErrorMap.d.ts.map +1 -1
- package/dist/Errors/GitHubErrorMap.js +12 -7
- package/dist/Errors/GitHubErrorMap.js.map +1 -1
- package/dist/FS/CliFs.d.ts.map +1 -1
- package/dist/FS/CliFs.js.map +1 -1
- package/dist/HttpClient/CliHttpClient.d.ts +17 -0
- package/dist/HttpClient/CliHttpClient.d.ts.map +1 -1
- package/dist/HttpClient/CliHttpClient.js +112 -1
- package/dist/HttpClient/CliHttpClient.js.map +1 -1
- package/dist/Logger/CliLogger.d.ts.map +1 -1
- package/dist/Logger/CliLogger.js +1 -1
- package/dist/Logger/CliLogger.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 +14 -3
- package/dist/Types/Command.types.d.ts.map +1 -1
- package/dist/Types/Command.types.js +4 -0
- package/dist/Types/Command.types.js.map +1 -1
- package/dist/Utils/BuildPolling.d.ts +18 -0
- package/dist/Utils/BuildPolling.d.ts.map +1 -0
- package/dist/Utils/BuildPolling.js +63 -0
- package/dist/Utils/BuildPolling.js.map +1 -0
- package/dist/Utils/BuildVerbDescriptionTable.d.ts +11 -1
- package/dist/Utils/BuildVerbDescriptionTable.d.ts.map +1 -1
- package/dist/Utils/BuildVerbDescriptionTable.js +73 -17
- package/dist/Utils/BuildVerbDescriptionTable.js.map +1 -1
- package/dist/Utils/ConsoleOutput.d.ts.map +1 -1
- package/dist/Utils/ConsoleOutput.js +15 -12
- package/dist/Utils/ConsoleOutput.js.map +1 -1
- package/dist/Utils/DcfRecovery.d.ts +84 -0
- package/dist/Utils/DcfRecovery.d.ts.map +1 -0
- package/dist/Utils/DcfRecovery.js +258 -0
- package/dist/Utils/DcfRecovery.js.map +1 -0
- package/dist/Utils/EnhanceNetworkError.d.ts.map +1 -1
- package/dist/Utils/EnhanceNetworkError.js +2 -0
- package/dist/Utils/EnhanceNetworkError.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 +4 -5
- package/dist/Utils/GitHubDcfFlow.d.ts.map +1 -1
- package/dist/Utils/GitHubDcfFlow.js +4 -5
- package/dist/Utils/GitHubDcfFlow.js.map +1 -1
- 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/ResolveCommand.d.ts +7 -1
- package/dist/Utils/ResolveCommand.d.ts.map +1 -1
- package/dist/Utils/ResolveCommand.js +38 -20
- package/dist/Utils/ResolveCommand.js.map +1 -1
- 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/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/BuildMaafApp.d.ts.map +1 -1
- package/dist/Verbs/BuildMaafApp.js +98 -22
- package/dist/Verbs/BuildMaafApp.js.map +1 -1
- 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 +75 -0
- package/dist/Verbs/CreateMaafApp.d.ts.map +1 -1
- package/dist/Verbs/CreateMaafApp.js +273 -75
- package/dist/Verbs/CreateMaafApp.js.map +1 -1
- package/dist/Verbs/DeployMaafApp.d.ts.map +1 -1
- package/dist/Verbs/DeployMaafApp.js +52 -20
- 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/GetMaafBuildStatus.d.ts.map +1 -1
- package/dist/Verbs/GetMaafBuildStatus.js +66 -17
- package/dist/Verbs/GetMaafBuildStatus.js.map +1 -1
- package/dist/Verbs/Init.d.ts.map +1 -1
- package/dist/Verbs/Init.js +170 -60
- 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/ListFlows.d.ts.map +1 -1
- package/dist/Verbs/ListFlows.js +1 -2
- package/dist/Verbs/ListFlows.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.map +1 -1
- package/dist/Verbs/MaafAppPermissions.js +4 -0
- 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/PlayMaafApp.d.ts +22 -0
- package/dist/Verbs/PlayMaafApp.d.ts.map +1 -0
- package/dist/Verbs/PlayMaafApp.js +147 -0
- package/dist/Verbs/PlayMaafApp.js.map +1 -0
- package/dist/Verbs/RefreshDataSource.d.ts.map +1 -1
- package/dist/Verbs/RefreshDataSource.js.map +1 -1
- package/dist/Verbs/RefreshGitAuth.d.ts.map +1 -1
- package/dist/Verbs/RefreshGitAuth.js +1 -1
- package/dist/Verbs/RefreshGitAuth.js.map +1 -1
- package/dist/Verbs/ShareLinkCreate.d.ts +23 -0
- package/dist/Verbs/ShareLinkCreate.d.ts.map +1 -0
- package/dist/Verbs/ShareLinkCreate.js +73 -0
- package/dist/Verbs/ShareLinkCreate.js.map +1 -0
- package/dist/Verbs/ShareLinkList.d.ts +16 -0
- package/dist/Verbs/ShareLinkList.d.ts.map +1 -0
- package/dist/Verbs/ShareLinkList.js +84 -0
- package/dist/Verbs/ShareLinkList.js.map +1 -0
- package/dist/Verbs/ShareLinkRevoke.d.ts +22 -0
- package/dist/Verbs/ShareLinkRevoke.d.ts.map +1 -0
- package/dist/Verbs/ShareLinkRevoke.js +137 -0
- package/dist/Verbs/ShareLinkRevoke.js.map +1 -0
- package/dist/Verbs/VerbConstants.d.ts +151 -21
- package/dist/Verbs/VerbConstants.d.ts.map +1 -1
- package/dist/Verbs/VerbConstants.js +127 -21
- package/dist/Verbs/VerbConstants.js.map +1 -1
- package/dist/Verbs/index.d.ts +6 -0
- package/dist/Verbs/index.d.ts.map +1 -1
- package/dist/Verbs/index.js +6 -0
- package/dist/Verbs/index.js.map +1 -1
- package/package.json +8 -8
|
@@ -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,19 +3,74 @@
|
|
|
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;
|
|
9
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Result of `commitAndPushScaffoldAsync`. Carried into the `--json` success
|
|
23
|
+
* envelope (as the `push` field) so automation can distinguish three states:
|
|
24
|
+
* push succeeded, push failed (with retry command), or no push attempted
|
|
25
|
+
* (field absent — e.g. `--repo none` where there is no remote).
|
|
26
|
+
*/
|
|
27
|
+
interface PushOutcome {
|
|
28
|
+
success: boolean;
|
|
29
|
+
error?: Record<string, unknown>;
|
|
30
|
+
retryCommand?: string;
|
|
31
|
+
}
|
|
10
32
|
/**
|
|
11
33
|
* Maps the raw `--repo` flag value to a `(repoType, remoteUrl)` pair.
|
|
12
34
|
* - omitted / empty → `native` (default GRS-backed flow)
|
|
13
35
|
* - `none` (case-insensitive) → `none` (no GRS, no local setup)
|
|
14
36
|
* - any other non-empty value → `github` (external GHE binding, value flows through as
|
|
15
37
|
* `remoteUrl` to the action and the eventual git clone)
|
|
38
|
+
*
|
|
39
|
+
* Runtime invariant: `remoteUrl` is set iff `repoType === 'github'`. Consumers
|
|
40
|
+
* branch on `repoType` and assert `remoteUrl!` at github use sites — see
|
|
41
|
+
* `RepoSelection` for why narrowing is not automatic.
|
|
16
42
|
*/
|
|
17
43
|
export declare function parseRepoOption(rawRepoValue: string | undefined): RepoSelection;
|
|
44
|
+
/**
|
|
45
|
+
* Creates a new MAAF app and (where applicable) sets up local source control.
|
|
46
|
+
*
|
|
47
|
+
* Three repo flows, selected by `--repo`:
|
|
48
|
+
* - `native` (default): server auto-provisions a GRS repo; local clone happens via GCM.
|
|
49
|
+
* - `github`: external GHE Cloud binding. Clones the user's repo locally. On the first
|
|
50
|
+
* `createAsync` call, a missing/expired server-side GitHub identity mapping is
|
|
51
|
+
* recoverable in-band: a single inline DCF run + exactly one `createAsync` retry.
|
|
52
|
+
* Any other error — or a second mapping failure after DCF — is a hard fail.
|
|
53
|
+
* - `none`: no git binding at all (just the server record + template + ms.config.json).
|
|
54
|
+
*/
|
|
18
55
|
export declare function createMaafAppAsync(argumentProvider: ArgumentProvider): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Commits the scaffolded files and pushes to the remote. Called by both `native`
|
|
58
|
+
* and `github` flows after writeRepoConfig.
|
|
59
|
+
*
|
|
60
|
+
* Failure is non-fatal: prints a warning with the retry command and returns
|
|
61
|
+
* `{ success: false, ... }`. The server-side app and local scaffold are unchanged.
|
|
62
|
+
*
|
|
63
|
+
* `stdio: ['ignore', 'ignore', 'inherit']`:
|
|
64
|
+
* - stdin ignored: child can't prompt for input (would block forever).
|
|
65
|
+
* - stdout ignored: discards git's progress prose so pretty output stays clean.
|
|
66
|
+
* - stderr inherited: git's actual error messages reach the user's terminal
|
|
67
|
+
* so they see git's own context alongside our warning.
|
|
68
|
+
*
|
|
69
|
+
* Commit identity (user.name / user.email) is read by git itself from
|
|
70
|
+
* local-then-global config — we pass nothing. Missing identity surfaces as
|
|
71
|
+
* git's own descriptive commit error through the inherited stderr.
|
|
72
|
+
*/
|
|
73
|
+
export declare function commitAndPushScaffoldAsync(appDir: string, jsonMode: boolean): Promise<PushOutcome>;
|
|
19
74
|
interface CloneRepoOptions {
|
|
20
75
|
directory: string;
|
|
21
76
|
repoUrl: string;
|
|
@@ -52,6 +107,26 @@ export declare function ensureGitInstalled(): void;
|
|
|
52
107
|
export declare function ensureTemplateSourceValid(source: string): void;
|
|
53
108
|
export declare function ensureTargetDirectoryEmpty(appDir: string): void;
|
|
54
109
|
export declare function ensureRepoTargetDirectoryEmpty(appDir: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Cheap pre-network probe to detect a non-empty remote BEFORE createAsync runs.
|
|
112
|
+
*
|
|
113
|
+
* Implementation: partial clone (`--depth=1 --filter=blob:none --no-checkout`)
|
|
114
|
+
* into an OS temp dir, then `git ls-tree -r HEAD`. The clone pulls refs + the
|
|
115
|
+
* tip commit + its tree objects only — no blob bytes, no working tree — so the
|
|
116
|
+
* bandwidth on the rejection path is tens of KB even for a multi-GB repo. The
|
|
117
|
+
* temp dir is removed in `finally`.
|
|
118
|
+
*
|
|
119
|
+
* Failure semantics — fail-OPEN:
|
|
120
|
+
* - Non-empty tree at HEAD → throws `UsageError` with the "is not empty" /
|
|
121
|
+
* "ms app init" actionable lead, BEFORE createAsync. No orphan, no leak.
|
|
122
|
+
* - Empty tree (incl. the cleaned-up-repo edge case: commit1 add, commit2
|
|
123
|
+
* delete all) → ls-tree returns no lines → returns without throwing.
|
|
124
|
+
* - Any error from git itself (auth, network blip, server doesn't support
|
|
125
|
+
* --filter, repo doesn't exist, etc.) → swallow and return. The subsequent
|
|
126
|
+
* cloneRepo will surface a friendlier message for the user-facing failure;
|
|
127
|
+
* we don't want this probe to become a parallel error-message surface.
|
|
128
|
+
*/
|
|
129
|
+
export declare function ensureExternalRepoIsEmpty(repoUrl: string): void;
|
|
55
130
|
export declare function ensureTargetDirectoryWritable(appDir: string): void;
|
|
56
131
|
export {};
|
|
57
132
|
//# sourceMappingURL=CreateMaafApp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateMaafApp.d.ts","sourceRoot":"","sources":["../../src/Verbs/CreateMaafApp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"CreateMaafApp.d.ts","sourceRoot":"","sources":["../../src/Verbs/CreateMaafApp.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAQzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA+B5D;;;;;;;;;;GAUG;AACH,UAAU,aAAa;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;GAKG;AACH,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAC;IAKjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;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,CAqY1F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,WAAW,CAAC,CAwCtB;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;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAmD/D;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BlE"}
|