@microsoft/managed-apps-cli 0.5.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/LICENSE +153 -0
- package/README.md +280 -0
- package/dist/ArgumentProvider.d.ts +102 -0
- package/dist/ArgumentProvider.d.ts.map +1 -0
- package/dist/ArgumentProvider.js +376 -0
- package/dist/ArgumentProvider.js.map +1 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts +18 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.js +99 -0
- package/dist/Authentication/NodeMsalAuthenticationProvider.js.map +1 -0
- package/dist/Authentication/OrchardAuthenticationProvider.d.ts +13 -0
- package/dist/Authentication/OrchardAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/OrchardAuthenticationProvider.js +30 -0
- package/dist/Authentication/OrchardAuthenticationProvider.js.map +1 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.d.ts +23 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.d.ts.map +1 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.js +60 -0
- package/dist/Authentication/ServicePrincipalAuthenticationProvider.js.map +1 -0
- package/dist/Bin.d.ts +6 -0
- package/dist/Bin.d.ts.map +1 -0
- package/dist/Bin.js +7 -0
- package/dist/Bin.js.map +1 -0
- package/dist/Cli.d.ts +2 -0
- package/dist/Cli.d.ts.map +1 -0
- package/dist/Cli.js +91 -0
- package/dist/Cli.js.map +1 -0
- package/dist/CliSettings.d.ts +14 -0
- package/dist/CliSettings.d.ts.map +1 -0
- package/dist/CliSettings.js +78 -0
- package/dist/CliSettings.js.map +1 -0
- package/dist/CliUtils.d.ts +92 -0
- package/dist/CliUtils.d.ts.map +1 -0
- package/dist/CliUtils.js +218 -0
- package/dist/CliUtils.js.map +1 -0
- package/dist/Constants/CliConstants.d.ts +6 -0
- package/dist/Constants/CliConstants.d.ts.map +1 -0
- package/dist/Constants/CliConstants.js +6 -0
- package/dist/Constants/CliConstants.js.map +1 -0
- package/dist/Constants/CommandRegistry.d.ts +23 -0
- package/dist/Constants/CommandRegistry.d.ts.map +1 -0
- package/dist/Constants/CommandRegistry.js +193 -0
- package/dist/Constants/CommandRegistry.js.map +1 -0
- package/dist/Constants/HelpStrings.d.ts +321 -0
- package/dist/Constants/HelpStrings.d.ts.map +1 -0
- package/dist/Constants/HelpStrings.js +438 -0
- package/dist/Constants/HelpStrings.js.map +1 -0
- package/dist/Constants.d.ts +10 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +18 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Errors/CliError.d.ts +5 -0
- package/dist/Errors/CliError.d.ts.map +1 -0
- package/dist/Errors/CliError.js +7 -0
- package/dist/Errors/CliError.js.map +1 -0
- package/dist/FS/CliFs.d.ts +41 -0
- package/dist/FS/CliFs.d.ts.map +1 -0
- package/dist/FS/CliFs.js +136 -0
- package/dist/FS/CliFs.js.map +1 -0
- package/dist/HttpClient/CliHttpClient.d.ts +24 -0
- package/dist/HttpClient/CliHttpClient.d.ts.map +1 -0
- package/dist/HttpClient/CliHttpClient.js +122 -0
- package/dist/HttpClient/CliHttpClient.js.map +1 -0
- package/dist/HttpClient/OrchardProxy.d.ts +11 -0
- package/dist/HttpClient/OrchardProxy.d.ts.map +1 -0
- package/dist/HttpClient/OrchardProxy.js +25 -0
- package/dist/HttpClient/OrchardProxy.js.map +1 -0
- package/dist/HttpClient/Proxy.d.ts +7 -0
- package/dist/HttpClient/Proxy.d.ts.map +1 -0
- package/dist/HttpClient/Proxy.js +5 -0
- package/dist/HttpClient/Proxy.js.map +1 -0
- package/dist/Logger/CliLogger.d.ts +36 -0
- package/dist/Logger/CliLogger.d.ts.map +1 -0
- package/dist/Logger/CliLogger.js +235 -0
- package/dist/Logger/CliLogger.js.map +1 -0
- package/dist/Logger/ConsoleWriter.d.ts +15 -0
- package/dist/Logger/ConsoleWriter.d.ts.map +1 -0
- package/dist/Logger/ConsoleWriter.js +45 -0
- package/dist/Logger/ConsoleWriter.js.map +1 -0
- package/dist/Logger/Constants.d.ts +6 -0
- package/dist/Logger/Constants.d.ts.map +1 -0
- package/dist/Logger/Constants.js +15 -0
- package/dist/Logger/Constants.js.map +1 -0
- package/dist/Logger/LoggerSettings.d.ts +19 -0
- package/dist/Logger/LoggerSettings.d.ts.map +1 -0
- package/dist/Logger/LoggerSettings.js +114 -0
- package/dist/Logger/LoggerSettings.js.map +1 -0
- package/dist/Logger/OneDSWriter.d.ts +22 -0
- package/dist/Logger/OneDSWriter.d.ts.map +1 -0
- package/dist/Logger/OneDSWriter.js +129 -0
- package/dist/Logger/OneDSWriter.js.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.d.ts +5 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.d.ts.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.js +46 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensions.js.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.d.ts +27 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.d.ts.map +1 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.js +168 -0
- package/dist/Logger/Scrubber/ScrubCustomDimensionsConfig.js.map +1 -0
- package/dist/Logger/Scrubber/ScrubUtils.d.ts +8 -0
- package/dist/Logger/Scrubber/ScrubUtils.d.ts.map +1 -0
- package/dist/Logger/Scrubber/ScrubUtils.js +34 -0
- package/dist/Logger/Scrubber/ScrubUtils.js.map +1 -0
- package/dist/Types/Argument.types.d.ts +27 -0
- package/dist/Types/Argument.types.d.ts.map +1 -0
- package/dist/Types/Argument.types.js +5 -0
- package/dist/Types/Argument.types.js.map +1 -0
- package/dist/Types/Cli.types.d.ts +32 -0
- package/dist/Types/Cli.types.d.ts.map +1 -0
- package/dist/Types/Cli.types.js +5 -0
- package/dist/Types/Cli.types.js.map +1 -0
- package/dist/Types/Command.types.d.ts +52 -0
- package/dist/Types/Command.types.d.ts.map +1 -0
- package/dist/Types/Command.types.js +8 -0
- package/dist/Types/Command.types.js.map +1 -0
- package/dist/Types/Datasource.types.d.ts +43 -0
- package/dist/Types/Datasource.types.d.ts.map +1 -0
- package/dist/Types/Datasource.types.js +5 -0
- package/dist/Types/Datasource.types.js.map +1 -0
- package/dist/Types/LoggerTypes.types.d.ts +17 -0
- package/dist/Types/LoggerTypes.types.d.ts.map +1 -0
- package/dist/Types/LoggerTypes.types.js +5 -0
- package/dist/Types/LoggerTypes.types.js.map +1 -0
- package/dist/Utils/BuildVerbDescriptionTable.d.ts +19 -0
- package/dist/Utils/BuildVerbDescriptionTable.d.ts.map +1 -0
- package/dist/Utils/BuildVerbDescriptionTable.js +87 -0
- package/dist/Utils/BuildVerbDescriptionTable.js.map +1 -0
- package/dist/Utils/ConsoleOutput.d.ts +80 -0
- package/dist/Utils/ConsoleOutput.d.ts.map +1 -0
- package/dist/Utils/ConsoleOutput.js +151 -0
- package/dist/Utils/ConsoleOutput.js.map +1 -0
- package/dist/Utils/DetectPackageManager.d.ts +9 -0
- package/dist/Utils/DetectPackageManager.d.ts.map +1 -0
- package/dist/Utils/DetectPackageManager.js +24 -0
- package/dist/Utils/DetectPackageManager.js.map +1 -0
- package/dist/Utils/EnhanceNetworkError.d.ts +14 -0
- package/dist/Utils/EnhanceNetworkError.d.ts.map +1 -0
- package/dist/Utils/EnhanceNetworkError.js +59 -0
- package/dist/Utils/EnhanceNetworkError.js.map +1 -0
- package/dist/Utils/EnvVars.d.ts +17 -0
- package/dist/Utils/EnvVars.d.ts.map +1 -0
- package/dist/Utils/EnvVars.js +38 -0
- package/dist/Utils/EnvVars.js.map +1 -0
- package/dist/Utils/GitCredentialConfig.d.ts +12 -0
- package/dist/Utils/GitCredentialConfig.d.ts.map +1 -0
- package/dist/Utils/GitCredentialConfig.js +32 -0
- package/dist/Utils/GitCredentialConfig.js.map +1 -0
- package/dist/Utils/GitUtils.d.ts +22 -0
- package/dist/Utils/GitUtils.d.ts.map +1 -0
- package/dist/Utils/GitUtils.js +35 -0
- package/dist/Utils/GitUtils.js.map +1 -0
- package/dist/Utils/Paging.d.ts +23 -0
- package/dist/Utils/Paging.d.ts.map +1 -0
- package/dist/Utils/Paging.js +67 -0
- package/dist/Utils/Paging.js.map +1 -0
- package/dist/Utils/ReadPackageJson.d.ts +9 -0
- package/dist/Utils/ReadPackageJson.d.ts.map +1 -0
- package/dist/Utils/ReadPackageJson.js +13 -0
- package/dist/Utils/ReadPackageJson.js.map +1 -0
- package/dist/Utils/ResolveCommand.d.ts +26 -0
- package/dist/Utils/ResolveCommand.d.ts.map +1 -0
- package/dist/Utils/ResolveCommand.js +62 -0
- package/dist/Utils/ResolveCommand.js.map +1 -0
- package/dist/Utils/RunCommand.d.ts +33 -0
- package/dist/Utils/RunCommand.d.ts.map +1 -0
- package/dist/Utils/RunCommand.js +83 -0
- package/dist/Utils/RunCommand.js.map +1 -0
- package/dist/Utils/Spinner.d.ts +15 -0
- package/dist/Utils/Spinner.d.ts.map +1 -0
- package/dist/Utils/Spinner.js +71 -0
- package/dist/Utils/Spinner.js.map +1 -0
- package/dist/Utils/zipBuildArtifact.d.ts +35 -0
- package/dist/Utils/zipBuildArtifact.d.ts.map +1 -0
- package/dist/Utils/zipBuildArtifact.js +100 -0
- package/dist/Utils/zipBuildArtifact.js.map +1 -0
- package/dist/Verbs/AddAction.d.ts +6 -0
- package/dist/Verbs/AddAction.d.ts.map +1 -0
- package/dist/Verbs/AddAction.js +87 -0
- package/dist/Verbs/AddAction.js.map +1 -0
- package/dist/Verbs/AddDataSource.d.ts +19 -0
- package/dist/Verbs/AddDataSource.d.ts.map +1 -0
- package/dist/Verbs/AddDataSource.js +173 -0
- package/dist/Verbs/AddDataSource.js.map +1 -0
- package/dist/Verbs/AddFlow.d.ts +12 -0
- package/dist/Verbs/AddFlow.d.ts.map +1 -0
- package/dist/Verbs/AddFlow.js +67 -0
- package/dist/Verbs/AddFlow.js.map +1 -0
- package/dist/Verbs/AddTable.d.ts +6 -0
- package/dist/Verbs/AddTable.d.ts.map +1 -0
- package/dist/Verbs/AddTable.js +163 -0
- package/dist/Verbs/AddTable.js.map +1 -0
- package/dist/Verbs/AuthStatus.d.ts +6 -0
- package/dist/Verbs/AuthStatus.d.ts.map +1 -0
- package/dist/Verbs/AuthStatus.js +18 -0
- package/dist/Verbs/AuthStatus.js.map +1 -0
- package/dist/Verbs/BuildMaafApp.d.ts +6 -0
- package/dist/Verbs/BuildMaafApp.d.ts.map +1 -0
- package/dist/Verbs/BuildMaafApp.js +96 -0
- package/dist/Verbs/BuildMaafApp.js.map +1 -0
- package/dist/Verbs/ConnectorHelpers.d.ts +37 -0
- package/dist/Verbs/ConnectorHelpers.d.ts.map +1 -0
- package/dist/Verbs/ConnectorHelpers.js +116 -0
- package/dist/Verbs/ConnectorHelpers.js.map +1 -0
- package/dist/Verbs/CreateMaafApp.d.ts +58 -0
- package/dist/Verbs/CreateMaafApp.d.ts.map +1 -0
- package/dist/Verbs/CreateMaafApp.js +712 -0
- package/dist/Verbs/CreateMaafApp.js.map +1 -0
- package/dist/Verbs/DeleteDataSource.d.ts +6 -0
- package/dist/Verbs/DeleteDataSource.d.ts.map +1 -0
- package/dist/Verbs/DeleteDataSource.js +105 -0
- package/dist/Verbs/DeleteDataSource.js.map +1 -0
- package/dist/Verbs/DeleteMaafApp.d.ts +23 -0
- package/dist/Verbs/DeleteMaafApp.d.ts.map +1 -0
- package/dist/Verbs/DeleteMaafApp.js +98 -0
- package/dist/Verbs/DeleteMaafApp.js.map +1 -0
- package/dist/Verbs/DeployMaafApp.d.ts +6 -0
- package/dist/Verbs/DeployMaafApp.d.ts.map +1 -0
- package/dist/Verbs/DeployMaafApp.js +501 -0
- package/dist/Verbs/DeployMaafApp.js.map +1 -0
- package/dist/Verbs/Dev.d.ts +6 -0
- package/dist/Verbs/Dev.d.ts.map +1 -0
- package/dist/Verbs/Dev.js +212 -0
- package/dist/Verbs/Dev.js.map +1 -0
- package/dist/Verbs/FindDataverseApi.d.ts +12 -0
- package/dist/Verbs/FindDataverseApi.d.ts.map +1 -0
- package/dist/Verbs/FindDataverseApi.js +101 -0
- package/dist/Verbs/FindDataverseApi.js.map +1 -0
- package/dist/Verbs/GetMaafApp.d.ts +6 -0
- package/dist/Verbs/GetMaafApp.d.ts.map +1 -0
- package/dist/Verbs/GetMaafApp.js +59 -0
- package/dist/Verbs/GetMaafApp.js.map +1 -0
- package/dist/Verbs/GetMaafBuildStatus.d.ts +6 -0
- package/dist/Verbs/GetMaafBuildStatus.d.ts.map +1 -0
- package/dist/Verbs/GetMaafBuildStatus.js +67 -0
- package/dist/Verbs/GetMaafBuildStatus.js.map +1 -0
- package/dist/Verbs/GetSettings.d.ts +12 -0
- package/dist/Verbs/GetSettings.d.ts.map +1 -0
- package/dist/Verbs/GetSettings.js +48 -0
- package/dist/Verbs/GetSettings.js.map +1 -0
- package/dist/Verbs/Init.d.ts +6 -0
- package/dist/Verbs/Init.d.ts.map +1 -0
- package/dist/Verbs/Init.js +171 -0
- package/dist/Verbs/Init.js.map +1 -0
- package/dist/Verbs/ListConnectionReferences.d.ts +6 -0
- package/dist/Verbs/ListConnectionReferences.d.ts.map +1 -0
- package/dist/Verbs/ListConnectionReferences.js +70 -0
- package/dist/Verbs/ListConnectionReferences.js.map +1 -0
- package/dist/Verbs/ListConnectorActions.d.ts +6 -0
- package/dist/Verbs/ListConnectorActions.d.ts.map +1 -0
- package/dist/Verbs/ListConnectorActions.js +73 -0
- package/dist/Verbs/ListConnectorActions.js.map +1 -0
- package/dist/Verbs/ListConnectors.d.ts +6 -0
- package/dist/Verbs/ListConnectors.d.ts.map +1 -0
- package/dist/Verbs/ListConnectors.js +66 -0
- package/dist/Verbs/ListConnectors.js.map +1 -0
- package/dist/Verbs/ListDatasets.d.ts +6 -0
- package/dist/Verbs/ListDatasets.d.ts.map +1 -0
- package/dist/Verbs/ListDatasets.js +82 -0
- package/dist/Verbs/ListDatasets.js.map +1 -0
- package/dist/Verbs/ListEnvironmentVariables.d.ts +14 -0
- package/dist/Verbs/ListEnvironmentVariables.d.ts.map +1 -0
- package/dist/Verbs/ListEnvironmentVariables.js +66 -0
- package/dist/Verbs/ListEnvironmentVariables.js.map +1 -0
- package/dist/Verbs/ListFlows.d.ts +13 -0
- package/dist/Verbs/ListFlows.d.ts.map +1 -0
- package/dist/Verbs/ListFlows.js +88 -0
- package/dist/Verbs/ListFlows.js.map +1 -0
- package/dist/Verbs/ListMaafApps.d.ts +71 -0
- package/dist/Verbs/ListMaafApps.d.ts.map +1 -0
- package/dist/Verbs/ListMaafApps.js +168 -0
- package/dist/Verbs/ListMaafApps.js.map +1 -0
- package/dist/Verbs/ListSqlStoredProcedures.d.ts +6 -0
- package/dist/Verbs/ListSqlStoredProcedures.d.ts.map +1 -0
- package/dist/Verbs/ListSqlStoredProcedures.js +84 -0
- package/dist/Verbs/ListSqlStoredProcedures.js.map +1 -0
- package/dist/Verbs/ListTables.d.ts +6 -0
- package/dist/Verbs/ListTables.d.ts.map +1 -0
- package/dist/Verbs/ListTables.js +94 -0
- package/dist/Verbs/ListTables.js.map +1 -0
- package/dist/Verbs/Login.d.ts +6 -0
- package/dist/Verbs/Login.d.ts.map +1 -0
- package/dist/Verbs/Login.js +28 -0
- package/dist/Verbs/Login.js.map +1 -0
- package/dist/Verbs/Logout.d.ts +6 -0
- package/dist/Verbs/Logout.d.ts.map +1 -0
- package/dist/Verbs/Logout.js +28 -0
- package/dist/Verbs/Logout.js.map +1 -0
- package/dist/Verbs/MaafAppPermissions.d.ts +23 -0
- package/dist/Verbs/MaafAppPermissions.d.ts.map +1 -0
- package/dist/Verbs/MaafAppPermissions.js +278 -0
- package/dist/Verbs/MaafAppPermissions.js.map +1 -0
- package/dist/Verbs/Pack.d.ts +42 -0
- package/dist/Verbs/Pack.d.ts.map +1 -0
- package/dist/Verbs/Pack.js +114 -0
- package/dist/Verbs/Pack.js.map +1 -0
- package/dist/Verbs/RefreshDataSource.d.ts +6 -0
- package/dist/Verbs/RefreshDataSource.d.ts.map +1 -0
- package/dist/Verbs/RefreshDataSource.js +72 -0
- package/dist/Verbs/RefreshDataSource.js.map +1 -0
- package/dist/Verbs/RemoveFlow.d.ts +12 -0
- package/dist/Verbs/RemoveFlow.d.ts.map +1 -0
- package/dist/Verbs/RemoveFlow.js +99 -0
- package/dist/Verbs/RemoveFlow.js.map +1 -0
- package/dist/Verbs/SetSetting.d.ts +12 -0
- package/dist/Verbs/SetSetting.d.ts.map +1 -0
- package/dist/Verbs/SetSetting.js +141 -0
- package/dist/Verbs/SetSetting.js.map +1 -0
- package/dist/Verbs/ShareMaafApp.d.ts +12 -0
- package/dist/Verbs/ShareMaafApp.d.ts.map +1 -0
- package/dist/Verbs/ShareMaafApp.js +14 -0
- package/dist/Verbs/ShareMaafApp.js.map +1 -0
- package/dist/Verbs/ShowMaafApp.d.ts +94 -0
- package/dist/Verbs/ShowMaafApp.d.ts.map +1 -0
- package/dist/Verbs/ShowMaafApp.js +216 -0
- package/dist/Verbs/ShowMaafApp.js.map +1 -0
- package/dist/Verbs/TelemetrySettings.d.ts +8 -0
- package/dist/Verbs/TelemetrySettings.d.ts.map +1 -0
- package/dist/Verbs/TelemetrySettings.js +104 -0
- package/dist/Verbs/TelemetrySettings.js.map +1 -0
- package/dist/Verbs/UnshareMaafApp.d.ts +12 -0
- package/dist/Verbs/UnshareMaafApp.d.ts.map +1 -0
- package/dist/Verbs/UnshareMaafApp.js +14 -0
- package/dist/Verbs/UnshareMaafApp.js.map +1 -0
- package/dist/Verbs/VerbConstants.d.ts +415 -0
- package/dist/Verbs/VerbConstants.d.ts.map +1 -0
- package/dist/Verbs/VerbConstants.js +382 -0
- package/dist/Verbs/VerbConstants.js.map +1 -0
- package/dist/Verbs/index.d.ts +39 -0
- package/dist/Verbs/index.d.ts.map +1 -0
- package/dist/Verbs/index.js +39 -0
- package/dist/Verbs/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import * as readline from 'readline';
|
|
6
|
+
import { printTable } from './ConsoleOutput.js';
|
|
7
|
+
export const PAGE_SIZE = 20;
|
|
8
|
+
/**
|
|
9
|
+
* Waits for a keypress in raw TTY mode.
|
|
10
|
+
* Enter/Space = continue, Esc/q = exit, Ctrl+C = process exit.
|
|
11
|
+
*/
|
|
12
|
+
export async function waitForPageKey() {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
readline.emitKeypressEvents(process.stdin);
|
|
15
|
+
if (process.stdin.isTTY) {
|
|
16
|
+
process.stdin.setRawMode(true);
|
|
17
|
+
}
|
|
18
|
+
process.stdin.resume();
|
|
19
|
+
const handler = (_str, key) => {
|
|
20
|
+
process.stdin.removeListener('keypress', handler);
|
|
21
|
+
if (process.stdin.isTTY) {
|
|
22
|
+
process.stdin.setRawMode(false);
|
|
23
|
+
}
|
|
24
|
+
process.stdin.pause();
|
|
25
|
+
if (key.ctrl && key.name === 'c') {
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
if (key.name === 'escape' || key.name === 'q') {
|
|
29
|
+
resolve('exit');
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
resolve('continue');
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
process.stdin.on('keypress', handler);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Prints a paginated table in TTY mode (20 rows per page, Enter/Esc to navigate)
|
|
40
|
+
* or a single full table in non-TTY/piped mode.
|
|
41
|
+
*/
|
|
42
|
+
export async function printPagedTable(options) {
|
|
43
|
+
const { title, metadata, columns, rows, emptyMessage, totalLabel } = options;
|
|
44
|
+
const total = rows.length;
|
|
45
|
+
if (!process.stdout.isTTY) {
|
|
46
|
+
printTable({ title, metadata, columns, rows, emptyMessage });
|
|
47
|
+
console.log(chalk.dim(` Showing ${total} of ${total} ${totalLabel}`));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
|
|
51
|
+
for (let page = 0; page < totalPages; page++) {
|
|
52
|
+
const start = page * PAGE_SIZE;
|
|
53
|
+
const pageRows = rows.slice(start, start + PAGE_SIZE);
|
|
54
|
+
const isLastPage = page === totalPages - 1;
|
|
55
|
+
printTable({ title, metadata, columns, rows: pageRows, emptyMessage });
|
|
56
|
+
console.log(chalk.dim(` Showing ${start + pageRows.length} of ${total} ${totalLabel}`));
|
|
57
|
+
if (!isLastPage) {
|
|
58
|
+
console.log(chalk.dim(' Press Enter for more, Esc or q to exit'));
|
|
59
|
+
}
|
|
60
|
+
if (isLastPage)
|
|
61
|
+
break;
|
|
62
|
+
const action = await waitForPageKey();
|
|
63
|
+
if (action === 'exit')
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=Paging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Paging.js","sourceRoot":"","sources":["../../src/Utils/Paging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
export interface PackageJson {
|
|
5
|
+
scripts?: Record<string, string>;
|
|
6
|
+
packageManager?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function readPackageJson(projectRoot: string): PackageJson;
|
|
9
|
+
//# sourceMappingURL=ReadPackageJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadPackageJson.d.ts","sourceRoot":"","sources":["../../src/Utils/ReadPackageJson.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAMhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
export function readPackageJson(projectRoot) {
|
|
7
|
+
const pkgPath = path.join(projectRoot, 'package.json');
|
|
8
|
+
if (!fs.existsSync(pkgPath)) {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
return JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ReadPackageJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadPackageJson.js","sourceRoot":"","sources":["../../src/Utils/ReadPackageJson.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAgB,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { CommandTree, NounKey, ResolvedCommand } from '../Types/Command.types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolves command-line tokens against the command tree.
|
|
7
|
+
*
|
|
8
|
+
* Every command lives under a noun, so the minimum match is 2 tokens (noun + verb).
|
|
9
|
+
* Typed subcommands match 3 tokens (noun + verb + type).
|
|
10
|
+
*
|
|
11
|
+
* @param argv - The full process.argv array (argv[0] = node, argv[1] = script)
|
|
12
|
+
* @param tree - The command tree to resolve against
|
|
13
|
+
* @returns The resolved command, or null if no match was found
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveCommand(argv: readonly string[], tree: CommandTree): ResolvedCommand | null;
|
|
16
|
+
/**
|
|
17
|
+
* Checks whether the given token is a known noun in the command tree.
|
|
18
|
+
* Used to distinguish `ms app` (show noun help) from `ms nonexistent` (error).
|
|
19
|
+
*/
|
|
20
|
+
export declare function isKnownNoun(token: string, tree: CommandTree): token is NounKey;
|
|
21
|
+
/**
|
|
22
|
+
* Checks whether the given noun + verb combination has typed subcommands.
|
|
23
|
+
* Used to show the type-picker help for `ms app add --help`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function hasTypedSubcommands(noun: string, verb: string, tree: CommandTree): boolean;
|
|
26
|
+
//# sourceMappingURL=ResolveCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResolveCommand.d.ts","sourceRoot":"","sources":["../../src/Utils/ResolveCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGpF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,IAAI,CAgCjG;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,KAAK,IAAI,OAAO,CAE9E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAK1F"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { isTypedVerbDef } from '../Types/Command.types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolves command-line tokens against the command tree.
|
|
7
|
+
*
|
|
8
|
+
* Every command lives under a noun, so the minimum match is 2 tokens (noun + verb).
|
|
9
|
+
* Typed subcommands match 3 tokens (noun + verb + type).
|
|
10
|
+
*
|
|
11
|
+
* @param argv - The full process.argv array (argv[0] = node, argv[1] = script)
|
|
12
|
+
* @param tree - The command tree to resolve against
|
|
13
|
+
* @returns The resolved command, or null if no match was found
|
|
14
|
+
*/
|
|
15
|
+
export function resolveCommand(argv, tree) {
|
|
16
|
+
const tokens = argv.slice(2);
|
|
17
|
+
// Skip if no tokens or first token looks like a flag
|
|
18
|
+
if (tokens.length === 0 || tokens[0].startsWith('-')) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const [t0, t1, t2] = tokens;
|
|
22
|
+
if (!isKnownNoun(t0, tree))
|
|
23
|
+
return null;
|
|
24
|
+
const nounDef = tree[t0];
|
|
25
|
+
// Try 3-token match: noun verb type (e.g., 'app add table')
|
|
26
|
+
if (t1 && !t1.startsWith('-') && t2 && !t2.startsWith('-')) {
|
|
27
|
+
const verbEntry = nounDef.commands[t1];
|
|
28
|
+
if (isTypedVerbDef(verbEntry)) {
|
|
29
|
+
const leafDef = verbEntry.commands[t2];
|
|
30
|
+
if (leafDef) {
|
|
31
|
+
return { path: [t0, t1, t2], handler: leafDef.handler, tokensConsumed: 3 };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Try 2-token match: noun verb (e.g., 'app init')
|
|
36
|
+
if (t1 && !t1.startsWith('-')) {
|
|
37
|
+
const verbEntry = nounDef.commands[t1];
|
|
38
|
+
if (verbEntry && !isTypedVerbDef(verbEntry)) {
|
|
39
|
+
return { path: [t0, t1], handler: verbEntry.handler, tokensConsumed: 2 };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Checks whether the given token is a known noun in the command tree.
|
|
46
|
+
* Used to distinguish `ms app` (show noun help) from `ms nonexistent` (error).
|
|
47
|
+
*/
|
|
48
|
+
export function isKnownNoun(token, tree) {
|
|
49
|
+
return token in tree;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Checks whether the given noun + verb combination has typed subcommands.
|
|
53
|
+
* Used to show the type-picker help for `ms app add --help`.
|
|
54
|
+
*/
|
|
55
|
+
export function hasTypedSubcommands(noun, verb, tree) {
|
|
56
|
+
if (!isKnownNoun(noun, tree))
|
|
57
|
+
return false;
|
|
58
|
+
const nounDef = tree[noun];
|
|
59
|
+
const verbEntry = nounDef.commands[verb];
|
|
60
|
+
return verbEntry !== undefined && isTypedVerbDef(verbEntry);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ResolveCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResolveCommand.js","sourceRoot":"","sources":["../../src/Utils/ResolveCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,IAAiB;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE7B,qDAAqD;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAEzB,4DAA4D;IAC5D,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAiB;IAC1D,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAY,EAAE,IAAiB;IAC/E,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
export interface RunCommandOptions {
|
|
5
|
+
/**
|
|
6
|
+
* When true, the child process's stdout/stderr are captured rather than inherited so
|
|
7
|
+
* the parent's stdout stays clean (e.g. JSON-mode callers). On failure the captured
|
|
8
|
+
* stderr is included in the thrown AppError's message; stdout is used as a fallback
|
|
9
|
+
* when stderr is silent (some toolchains route diagnostics through stdout).
|
|
10
|
+
*/
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Per-stream tail cap (in bytes) for quiet-mode capture. Defaults to
|
|
14
|
+
* {@link CAPTURE_TAIL_CAP_BYTES} (8 KB). Override when a caller needs a smaller or
|
|
15
|
+
* larger diagnostic tail than the default (e.g. very chatty toolchains that flush a
|
|
16
|
+
* relevant stack trace beyond 8 KB, or extra-small callers writing to a constrained
|
|
17
|
+
* telemetry sink). Ignored when `quiet` is false.
|
|
18
|
+
*/
|
|
19
|
+
captureTailCapBytes?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Default per-stream tail cap for quiet-mode capture. A chatty `--verbose` build can
|
|
23
|
+
* spew tens or hundreds of MB; that whole payload would otherwise land in
|
|
24
|
+
* `AppError.message`, the JSON `errorMessage`, and the `trackErrorEvent` OneDS event.
|
|
25
|
+
* We keep only the tail — which is where the actual failure diagnostic lives — and
|
|
26
|
+
* prepend a marker line so the consumer knows truncation happened.
|
|
27
|
+
*
|
|
28
|
+
* 8 KB ≈ 8000 characters of mostly-ASCII tool output (~100 lines at 80 cols) — enough
|
|
29
|
+
* to capture a typical stack trace or compiler diagnostic without bloating telemetry.
|
|
30
|
+
*/
|
|
31
|
+
export declare const CAPTURE_TAIL_CAP_BYTES: number;
|
|
32
|
+
export declare function runCommandAsync(command: string, cwd: string, options?: RunCommandOptions): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=RunCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunCommand.d.ts","sourceRoot":"","sources":["../../src/Utils/RunCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,QAAW,CAAC;AAuC/C,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmCf"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
import { AppError } from '../Errors/CliError.js';
|
|
6
|
+
/**
|
|
7
|
+
* Default per-stream tail cap for quiet-mode capture. A chatty `--verbose` build can
|
|
8
|
+
* spew tens or hundreds of MB; that whole payload would otherwise land in
|
|
9
|
+
* `AppError.message`, the JSON `errorMessage`, and the `trackErrorEvent` OneDS event.
|
|
10
|
+
* We keep only the tail — which is where the actual failure diagnostic lives — and
|
|
11
|
+
* prepend a marker line so the consumer knows truncation happened.
|
|
12
|
+
*
|
|
13
|
+
* 8 KB ≈ 8000 characters of mostly-ASCII tool output (~100 lines at 80 cols) — enough
|
|
14
|
+
* to capture a typical stack trace or compiler diagnostic without bloating telemetry.
|
|
15
|
+
*/
|
|
16
|
+
export const CAPTURE_TAIL_CAP_BYTES = 8 * 1024;
|
|
17
|
+
function makeSink() {
|
|
18
|
+
return { chunks: [], bytes: 0, dropped: 0 };
|
|
19
|
+
}
|
|
20
|
+
function appendCapped(sink, chunk, cap) {
|
|
21
|
+
sink.chunks.push(chunk);
|
|
22
|
+
sink.bytes += chunk.length;
|
|
23
|
+
while (sink.bytes > cap) {
|
|
24
|
+
const overflow = sink.bytes - cap;
|
|
25
|
+
const head = sink.chunks[0];
|
|
26
|
+
if (head.length <= overflow) {
|
|
27
|
+
sink.chunks.shift();
|
|
28
|
+
sink.bytes -= head.length;
|
|
29
|
+
sink.dropped += head.length;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
sink.chunks[0] = head.subarray(overflow);
|
|
33
|
+
sink.bytes -= overflow;
|
|
34
|
+
sink.dropped += overflow;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function decodeSink(sink) {
|
|
39
|
+
// toString('utf8') on a sliced tail may yield a replacement char at byte 0 if the
|
|
40
|
+
// slice cut a multi-byte codepoint — acceptable for a diagnostic message; the
|
|
41
|
+
// surrounding context still reads correctly.
|
|
42
|
+
const tail = Buffer.concat(sink.chunks).toString('utf8').trimEnd();
|
|
43
|
+
if (sink.dropped === 0)
|
|
44
|
+
return tail;
|
|
45
|
+
return `[truncated earlier ${sink.dropped} bytes; showing last ${sink.bytes} bytes]\n${tail}`;
|
|
46
|
+
}
|
|
47
|
+
export function runCommandAsync(command, cwd, options = {}) {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const { quiet = false, captureTailCapBytes = CAPTURE_TAIL_CAP_BYTES } = options;
|
|
50
|
+
const child = spawn(command, {
|
|
51
|
+
cwd,
|
|
52
|
+
stdio: quiet ? ['ignore', 'pipe', 'pipe'] : 'inherit',
|
|
53
|
+
shell: true,
|
|
54
|
+
});
|
|
55
|
+
// Collect raw bytes (capped per stream) and decode once at close — avoids
|
|
56
|
+
// mojibake from a UTF-8 character split across two `data` chunks, and keeps
|
|
57
|
+
// both the envelope and the OneDS event size-bounded under chatty builds.
|
|
58
|
+
const stdoutSink = makeSink();
|
|
59
|
+
const stderrSink = makeSink();
|
|
60
|
+
if (quiet) {
|
|
61
|
+
child.stdout?.on('data', (c) => appendCapped(stdoutSink, c, captureTailCapBytes));
|
|
62
|
+
child.stderr?.on('data', (c) => appendCapped(stderrSink, c, captureTailCapBytes));
|
|
63
|
+
}
|
|
64
|
+
child.on('close', (code) => {
|
|
65
|
+
if (code === 0) {
|
|
66
|
+
resolve();
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const base = `Command exited with code ${code}: ${command}`;
|
|
70
|
+
if (!quiet) {
|
|
71
|
+
reject(new AppError(base, code ?? 1));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const stderr = decodeSink(stderrSink);
|
|
75
|
+
const stdout = decodeSink(stdoutSink);
|
|
76
|
+
const detail = stderr.length > 0 ? stderr : stdout;
|
|
77
|
+
const message = detail.length > 0 ? `${base}\n${detail}` : base;
|
|
78
|
+
reject(new AppError(message, code ?? 1));
|
|
79
|
+
});
|
|
80
|
+
child.on('error', reject);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=RunCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunCommand.js","sourceRoot":"","sources":["../../src/Utils/RunCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
export declare class CliSpinner {
|
|
5
|
+
private _timer;
|
|
6
|
+
private _frameIndex;
|
|
7
|
+
private _restoreCursor;
|
|
8
|
+
private _handleSIGINT;
|
|
9
|
+
private _handleSIGTERM;
|
|
10
|
+
private _handleUncaughtException;
|
|
11
|
+
private _handleUnhandledRejection;
|
|
12
|
+
start(): void;
|
|
13
|
+
stop(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Spinner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.d.ts","sourceRoot":"","sources":["../../src/Utils/Spinner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,WAAW,CAAK;IAGxB,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,aAAa,CAKnB;IAEF,OAAO,CAAC,cAAc,CAIpB;IAEF,OAAO,CAAC,wBAAwB,CAK9B;IAEF,OAAO,CAAC,yBAAyB,CAI/B;IAEF,KAAK,IAAI,IAAI;IAeb,IAAI,IAAI,IAAI;CAcb"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
// SYNC: this file is duplicated in packages/power-apps-cli/src/Utils/Spinner.ts.
|
|
5
|
+
// Changes here must be mirrored there until a shared CLI utilities package exists.
|
|
6
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
7
|
+
export class CliSpinner {
|
|
8
|
+
_timer = null;
|
|
9
|
+
_frameIndex = 0;
|
|
10
|
+
// Arrow functions so `this` is stable when passed to process.on/off.
|
|
11
|
+
_restoreCursor = () => {
|
|
12
|
+
process.stdout.write('\r\x1B[K'); // erase spinner line
|
|
13
|
+
process.stdout.write('\x1B[?25h'); // show cursor
|
|
14
|
+
};
|
|
15
|
+
_handleSIGINT = () => {
|
|
16
|
+
if (this._timer !== null)
|
|
17
|
+
clearInterval(this._timer);
|
|
18
|
+
this._restoreCursor();
|
|
19
|
+
// Re-raise so the process actually exits with the correct signal.
|
|
20
|
+
process.kill(process.pid, 'SIGINT');
|
|
21
|
+
};
|
|
22
|
+
_handleSIGTERM = () => {
|
|
23
|
+
if (this._timer !== null)
|
|
24
|
+
clearInterval(this._timer);
|
|
25
|
+
this._restoreCursor();
|
|
26
|
+
process.kill(process.pid, 'SIGTERM');
|
|
27
|
+
};
|
|
28
|
+
_handleUncaughtException = (error) => {
|
|
29
|
+
if (this._timer !== null)
|
|
30
|
+
clearInterval(this._timer);
|
|
31
|
+
this._restoreCursor();
|
|
32
|
+
// Re-throw so Node.js prints the error and exits with code 1.
|
|
33
|
+
throw error;
|
|
34
|
+
};
|
|
35
|
+
_handleUnhandledRejection = (reason) => {
|
|
36
|
+
if (this._timer !== null)
|
|
37
|
+
clearInterval(this._timer);
|
|
38
|
+
this._restoreCursor();
|
|
39
|
+
throw reason;
|
|
40
|
+
};
|
|
41
|
+
start() {
|
|
42
|
+
if (this._timer !== null)
|
|
43
|
+
return;
|
|
44
|
+
process.stdout.write('\x1B[?25l'); // hide cursor
|
|
45
|
+
// Restore cursor if the process exits before stop() is called normally.
|
|
46
|
+
process.once('exit', this._restoreCursor);
|
|
47
|
+
process.once('SIGINT', this._handleSIGINT);
|
|
48
|
+
process.once('SIGTERM', this._handleSIGTERM);
|
|
49
|
+
process.once('uncaughtException', this._handleUncaughtException);
|
|
50
|
+
process.once('unhandledRejection', this._handleUnhandledRejection);
|
|
51
|
+
this._timer = setInterval(() => {
|
|
52
|
+
process.stdout.write(`\r${SPINNER_FRAMES[this._frameIndex]}`);
|
|
53
|
+
this._frameIndex = (this._frameIndex + 1) % SPINNER_FRAMES.length;
|
|
54
|
+
}, 80);
|
|
55
|
+
}
|
|
56
|
+
stop() {
|
|
57
|
+
if (this._timer !== null) {
|
|
58
|
+
clearInterval(this._timer);
|
|
59
|
+
this._timer = null;
|
|
60
|
+
this._frameIndex = 0;
|
|
61
|
+
// Clean up exit handlers registered in start().
|
|
62
|
+
process.off('exit', this._restoreCursor);
|
|
63
|
+
process.off('SIGINT', this._handleSIGINT);
|
|
64
|
+
process.off('SIGTERM', this._handleSIGTERM);
|
|
65
|
+
process.off('uncaughtException', this._handleUncaughtException);
|
|
66
|
+
process.off('unhandledRejection', this._handleUnhandledRejection);
|
|
67
|
+
this._restoreCursor();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=Spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Spinner.js","sourceRoot":"","sources":["../../src/Utils/Spinner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Decision for a single `archiver` `'warning'` event:
|
|
6
|
+
* - `'continue'`: log and proceed (ENOENT — vanished file or dangling symlink).
|
|
7
|
+
* - `Error`: reject the archive with this error (anything else).
|
|
8
|
+
*
|
|
9
|
+
* Extracted from {@link zipBuildArtifact} so the policy can be unit-tested directly without
|
|
10
|
+
* needing to provoke real archiver warnings (non-ENOENT cases are hard to provoke
|
|
11
|
+
* cross-platform). The handler is intentionally pure: no I/O, no side effects.
|
|
12
|
+
*/
|
|
13
|
+
export declare function classifyArchiveWarning(err: unknown): 'continue' | Error;
|
|
14
|
+
/**
|
|
15
|
+
* Formats the user-facing warning line for an ENOENT entry. Lives here so the test for the
|
|
16
|
+
* warning text doesn't have to import {@link zipBuildArtifact}'s internals.
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatMissingEntryWarning(err: unknown): string;
|
|
19
|
+
/**
|
|
20
|
+
* Zips the contents of `buildPath` (flattened — `buildPath`'s files appear at the zip root,
|
|
21
|
+
* not nested under a `build/` directory) and adds `ms.config.json` at the same root.
|
|
22
|
+
*
|
|
23
|
+
* The resulting `Buffer` is the entire zip in memory. When `maxBytes` is supplied, the helper
|
|
24
|
+
* counts emitted bytes as the archive streams and aborts as soon as the running total exceeds
|
|
25
|
+
* the cap — preventing OOM when the source tree is huge. Callers that don't enforce a cap can
|
|
26
|
+
* omit the option.
|
|
27
|
+
*
|
|
28
|
+
* The helper is a pure file-IO utility: it does not parse `ms.config.json`. Callers that
|
|
29
|
+
* need the schema (e.g. `appId`) should read it separately. ENOENT warnings during archiving
|
|
30
|
+
* (vanished files, dangling symlinks) are surfaced to stderr; non-ENOENT warnings reject.
|
|
31
|
+
*/
|
|
32
|
+
export declare function zipBuildArtifact(buildPath: string, appConfigPath: string, options?: {
|
|
33
|
+
maxBytes?: number;
|
|
34
|
+
}): Promise<Buffer>;
|
|
35
|
+
//# sourceMappingURL=zipBuildArtifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zipBuildArtifact.d.ts","sourceRoot":"","sources":["../../src/Utils/zipBuildArtifact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,KAAK,CAIvE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAG9D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,CAAC,CAuDjB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { promises as fs } from 'node:fs';
|
|
5
|
+
import { AppConfigFileName } from '@microsoft/managed-apps-common/config';
|
|
6
|
+
import { BuildArtifactTooLargeError, UsageError } from '@microsoft/managed-apps-common/errors';
|
|
7
|
+
import archiver from 'archiver';
|
|
8
|
+
import { printWarning } from './ConsoleOutput.js';
|
|
9
|
+
/**
|
|
10
|
+
* Decision for a single `archiver` `'warning'` event:
|
|
11
|
+
* - `'continue'`: log and proceed (ENOENT — vanished file or dangling symlink).
|
|
12
|
+
* - `Error`: reject the archive with this error (anything else).
|
|
13
|
+
*
|
|
14
|
+
* Extracted from {@link zipBuildArtifact} so the policy can be unit-tested directly without
|
|
15
|
+
* needing to provoke real archiver warnings (non-ENOENT cases are hard to provoke
|
|
16
|
+
* cross-platform). The handler is intentionally pure: no I/O, no side effects.
|
|
17
|
+
*/
|
|
18
|
+
export function classifyArchiveWarning(err) {
|
|
19
|
+
const code = err?.code;
|
|
20
|
+
if (code === 'ENOENT')
|
|
21
|
+
return 'continue';
|
|
22
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Formats the user-facing warning line for an ENOENT entry. Lives here so the test for the
|
|
26
|
+
* warning text doesn't have to import {@link zipBuildArtifact}'s internals.
|
|
27
|
+
*/
|
|
28
|
+
export function formatMissingEntryWarning(err) {
|
|
29
|
+
const path = err?.path ?? '<unknown>';
|
|
30
|
+
return `zipBuildArtifact: skipping missing entry: ${path}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Zips the contents of `buildPath` (flattened — `buildPath`'s files appear at the zip root,
|
|
34
|
+
* not nested under a `build/` directory) and adds `ms.config.json` at the same root.
|
|
35
|
+
*
|
|
36
|
+
* The resulting `Buffer` is the entire zip in memory. When `maxBytes` is supplied, the helper
|
|
37
|
+
* counts emitted bytes as the archive streams and aborts as soon as the running total exceeds
|
|
38
|
+
* the cap — preventing OOM when the source tree is huge. Callers that don't enforce a cap can
|
|
39
|
+
* omit the option.
|
|
40
|
+
*
|
|
41
|
+
* The helper is a pure file-IO utility: it does not parse `ms.config.json`. Callers that
|
|
42
|
+
* need the schema (e.g. `appId`) should read it separately. ENOENT warnings during archiving
|
|
43
|
+
* (vanished files, dangling symlinks) are surfaced to stderr; non-ENOENT warnings reject.
|
|
44
|
+
*/
|
|
45
|
+
export async function zipBuildArtifact(buildPath, appConfigPath, options) {
|
|
46
|
+
const buildStat = await fs.stat(buildPath).catch(() => null);
|
|
47
|
+
if (!buildStat) {
|
|
48
|
+
throw new UsageError(`buildPath not found: ${buildPath}`);
|
|
49
|
+
}
|
|
50
|
+
if (!buildStat.isDirectory()) {
|
|
51
|
+
throw new UsageError(`buildPath is not a directory: ${buildPath}`);
|
|
52
|
+
}
|
|
53
|
+
const configStat = await fs.stat(appConfigPath).catch(() => null);
|
|
54
|
+
if (!configStat || !configStat.isFile()) {
|
|
55
|
+
throw new UsageError(`appConfigPath does not point to a file: ${appConfigPath}`);
|
|
56
|
+
}
|
|
57
|
+
const maxBytes = options?.maxBytes;
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const chunks = [];
|
|
60
|
+
let totalBytes = 0;
|
|
61
|
+
let aborted = false;
|
|
62
|
+
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
63
|
+
archive.on('data', (chunk) => {
|
|
64
|
+
if (aborted)
|
|
65
|
+
return;
|
|
66
|
+
totalBytes += chunk.length;
|
|
67
|
+
if (maxBytes !== undefined && totalBytes > maxBytes) {
|
|
68
|
+
aborted = true;
|
|
69
|
+
archive.abort();
|
|
70
|
+
reject(new BuildArtifactTooLargeError({ capBytes: maxBytes, bytes: totalBytes }));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
chunks.push(chunk);
|
|
74
|
+
});
|
|
75
|
+
archive.on('warning', (err) => {
|
|
76
|
+
if (aborted)
|
|
77
|
+
return;
|
|
78
|
+
const decision = classifyArchiveWarning(err);
|
|
79
|
+
if (decision === 'continue') {
|
|
80
|
+
// Surface to stderr via the CLI's logger pipeline so the line is chalk-coloured
|
|
81
|
+
// alongside other CLI output, and so test seams can intercept it.
|
|
82
|
+
printWarning(formatMissingEntryWarning(err));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
reject(decision);
|
|
86
|
+
});
|
|
87
|
+
archive.on('error', (err) => {
|
|
88
|
+
if (!aborted)
|
|
89
|
+
reject(err);
|
|
90
|
+
});
|
|
91
|
+
archive.on('end', () => {
|
|
92
|
+
if (!aborted)
|
|
93
|
+
resolve(Buffer.concat(chunks));
|
|
94
|
+
});
|
|
95
|
+
archive.directory(buildPath, false);
|
|
96
|
+
archive.file(appConfigPath, { name: AppConfigFileName });
|
|
97
|
+
void archive.finalize();
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=zipBuildArtifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zipBuildArtifact.js","sourceRoot":"","sources":["../../src/Utils/zipBuildArtifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (C) Microsoft Corporation. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import type { ArgumentProvider } from '../ArgumentProvider.js';
|
|
5
|
+
export declare function addActionAsync(argumentProvider: ArgumentProvider): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=AddAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddAction.d.ts","sourceRoot":"","sources":["../../src/Verbs/AddAction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAY5D,wBAAsB,cAAc,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDtF"}
|