@pnp/cli-microsoft365 10.0.0-beta.a868b81 → 10.0.0-beta.d126736
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/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Auth.js +6 -4
- package/dist/AuthServer.js +7 -7
- package/dist/Command.js +4 -1
- package/dist/api.js +1 -1
- package/dist/config.js +1 -0
- package/dist/m365/cli/commands/cli-doctor.js +2 -2
- package/dist/m365/cli/commands.js +1 -2
- package/dist/m365/commands/login.js +1 -1
- package/dist/m365/entra/commands/m365group/m365group-set.js +24 -16
- package/dist/m365/entra/commands/m365group/m365group-user-add.js +5 -12
- package/dist/m365/entra/commands/oauth2grant/oauth2grant-list.js +3 -12
- package/dist/m365/external/commands/item/item-add.js +2 -5
- package/dist/m365/file/commands/file-move.js +135 -0
- package/dist/m365/file/commands.js +2 -1
- package/dist/m365/flow/commands/environment/environment-list.js +1 -1
- package/dist/m365/flow/commands/recyclebinitem/recyclebinitem-list.js +47 -0
- package/dist/m365/flow/commands/recyclebinitem/recyclebinitem-restore.js +48 -0
- package/dist/m365/flow/commands.js +2 -0
- package/dist/m365/pa/commands/app/app-list.js +1 -6
- package/dist/m365/pa/commands/connector/connector-list.js +1 -6
- package/dist/m365/pa/commands/environment/environment-list.js +1 -1
- package/dist/m365/pp/commands/environment/environment-list.js +1 -1
- package/dist/m365/spfx/commands/project/project-doctor/doctor-1.20.0.js +27 -0
- package/dist/m365/spfx/commands/project/project-doctor/rules/FN002021_DEVDEP_rushstack_eslint_config.js +10 -0
- package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
- package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.20.0.js +59 -0
- package/dist/m365/spfx/commands/project/project-upgrade.js +2 -1
- package/dist/m365/spfx/commands/spfx-doctor.js +15 -0
- package/dist/m365/spo/commands/app/app-instance-list.js +3 -18
- package/dist/m365/spo/commands/app/app-list.js +1 -8
- package/dist/m365/spo/commands/feature/feature-list.js +1 -8
- package/dist/m365/spo/commands/file/file-copy.js +5 -1
- package/dist/m365/spo/commands/file/file-move.js +55 -33
- package/dist/m365/spo/commands/folder/folder-sharinglink-add.js +143 -0
- package/dist/m365/spo/commands/folder/folder-sharinglink-clear.js +111 -0
- package/dist/m365/spo/commands/folder/folder-sharinglink-remove.js +95 -0
- package/dist/m365/spo/commands/list/list-webhook-list.js +1 -6
- package/dist/m365/spo/commands/listitem/listitem-attachment-list.js +1 -8
- package/dist/m365/spo/commands/page/page-list.js +1 -1
- package/dist/m365/spo/commands/page/page-remove.js +37 -16
- package/dist/m365/spo/commands/page/page-template-list.js +1 -3
- package/dist/m365/spo/commands/site/SiteAdmin.js +2 -0
- package/dist/m365/spo/commands/site/site-admin-add.js +252 -0
- package/dist/m365/spo/commands/site/site-admin-list.js +10 -36
- package/dist/m365/spo/commands/site/site-admin-remove.js +194 -0
- package/dist/m365/spo/commands/site/site-sharingpermission-set.js +68 -0
- package/dist/m365/spo/commands/sitescript/sitescript-get.js +3 -2
- package/dist/m365/spo/commands/sitescript/sitescript-list.js +1 -3
- package/dist/m365/spo/commands/{site/site-rename.js → tenant/tenant-site-rename.js} +29 -32
- package/dist/m365/spo/commands/theme/theme-list.js +1 -1
- package/dist/m365/spo/commands/user/user-get.js +67 -9
- package/dist/m365/spo/commands/web/web-clientsidewebpart-list.js +1 -6
- package/dist/m365/spo/commands.js +7 -1
- package/dist/m365/spp/commands/contentcenter/contentcenter-list.js +56 -0
- package/dist/m365/spp/commands.js +5 -0
- package/dist/m365/teams/MeetingTranscript.js +2 -0
- package/dist/m365/teams/commands/meeting/meeting-transcript-get.js +152 -0
- package/dist/m365/teams/commands/tab/tab-list.js +5 -3
- package/dist/m365/teams/commands.js +1 -0
- package/dist/m365/viva/commands/engage/Community.js +2 -0
- package/dist/m365/viva/commands/engage/engage-community-list.js +28 -0
- package/dist/m365/viva/commands.js +1 -0
- package/dist/request.js +46 -61
- package/dist/utils/driveUtil.js +51 -0
- package/dist/utils/spo.js +46 -1
- package/dist/utils/timersUtil.js +12 -0
- package/dist/utils/urlUtil.js +8 -0
- package/dist/utils/zod.js +1 -1
- package/docs/docs/cmd/cli/cli-doctor.mdx +24 -23
- package/docs/docs/cmd/entra/m365group/m365group-report-activitystorage.mdx +2 -2
- package/docs/docs/cmd/entra/m365group/m365group-set.mdx +9 -6
- package/docs/docs/cmd/entra/m365group/m365group-user-add.mdx +0 -3
- package/docs/docs/cmd/external/item/item-add.mdx +3 -3
- package/docs/docs/cmd/file/file-move.mdx +79 -0
- package/docs/docs/cmd/flow/recyclebinitem/recyclebinitem-list.mdx +132 -0
- package/docs/docs/cmd/flow/recyclebinitem/recyclebinitem-restore.mdx +55 -0
- package/docs/docs/cmd/spfx/project/project-upgrade.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-get.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-origin-add.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-origin-list.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-origin-remove.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-policy-list.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-policy-set.mdx +1 -1
- package/docs/docs/cmd/spo/externaluser/externaluser-list.mdx +1 -1
- package/docs/docs/cmd/spo/file/file-move.mdx +116 -9
- package/docs/docs/cmd/spo/folder/folder-sharinglink-add.mdx +125 -0
- package/docs/docs/cmd/spo/folder/folder-sharinglink-clear.mdx +50 -0
- package/docs/docs/cmd/spo/folder/folder-sharinglink-remove.mdx +50 -0
- package/docs/docs/cmd/spo/hidedefaultthemes/hidedefaultthemes-get.mdx +1 -1
- package/docs/docs/cmd/spo/hidedefaultthemes/hidedefaultthemes-set.mdx +1 -1
- package/docs/docs/cmd/spo/homesite/homesite-remove.mdx +1 -1
- package/docs/docs/cmd/spo/knowledgehub/knowledgehub-get.mdx +1 -1
- package/docs/docs/cmd/spo/knowledgehub/knowledgehub-remove.mdx +1 -1
- package/docs/docs/cmd/spo/knowledgehub/knowledgehub-set.mdx +1 -1
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-add.mdx +1 -1
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-list.mdx +1 -1
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-remove.mdx +1 -1
- package/docs/docs/cmd/spo/orgnewssite/orgnewssite-list.mdx +1 -1
- package/docs/docs/cmd/spo/orgnewssite/orgnewssite-remove.mdx +1 -1
- package/docs/docs/cmd/spo/orgnewssite/orgnewssite-set.mdx +1 -1
- package/docs/docs/cmd/spo/page/page-remove.mdx +30 -12
- package/docs/docs/cmd/spo/site/site-admin-add.mdx +67 -0
- package/docs/docs/cmd/spo/site/site-admin-list.mdx +64 -12
- package/docs/docs/cmd/spo/site/site-admin-remove.mdx +67 -0
- package/docs/docs/cmd/spo/site/site-appcatalog-add.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-appcatalog-remove.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-commsite-enable.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-list.mdx +6 -4
- package/docs/docs/cmd/spo/site/site-set.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-sharingpermission-set.mdx +58 -0
- package/docs/docs/cmd/spo/sitescript/sitescript-get.mdx +14 -1
- package/docs/docs/cmd/spo/storageentity/storageentity-remove.mdx +1 -1
- package/docs/docs/cmd/spo/storageentity/storageentity-set.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-appcatalog-add.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-appcatalogurl-get.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-recyclebinitem-list.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-recyclebinitem-remove.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-settings-list.mdx +1 -1
- package/docs/docs/cmd/spo/{site/site-rename.mdx → tenant/tenant-site-rename.mdx} +7 -7
- package/docs/docs/cmd/spo/theme/theme-apply.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-get.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-list.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-remove.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-set.mdx +1 -1
- package/docs/docs/cmd/spo/user/user-get.mdx +35 -9
- package/docs/docs/cmd/spp/contentcenter/contentcenter-list.mdx +287 -0
- package/docs/docs/cmd/teams/meeting/meeting-transcript-get.mdx +132 -0
- package/docs/docs/cmd/teams/tab/tab-list.mdx +1 -2
- package/docs/docs/cmd/viva/engage/engage-community-list.mdx +81 -0
- package/npm-shrinkwrap.json +203 -375
- package/package.json +16 -17
- package/dist/m365/cli/commands/cli-reconsent.js +0 -29
- package/docs/docs/cmd/cli/cli-reconsent.mdx +0 -62
package/dist/Auth.js
CHANGED
|
@@ -117,7 +117,7 @@ export class Auth {
|
|
|
117
117
|
async restoreAuth() {
|
|
118
118
|
// check if auth has been restored previously
|
|
119
119
|
if (this._connection.active) {
|
|
120
|
-
return
|
|
120
|
+
return;
|
|
121
121
|
}
|
|
122
122
|
try {
|
|
123
123
|
const connection = await this.getConnectionInfoFromStorage();
|
|
@@ -353,7 +353,9 @@ export class Auth {
|
|
|
353
353
|
await logger.logToStderr(response);
|
|
354
354
|
await logger.logToStderr('');
|
|
355
355
|
}
|
|
356
|
-
|
|
356
|
+
if (response.message) {
|
|
357
|
+
await logger.logToStderr(`🌶️ ${response.message}`);
|
|
358
|
+
}
|
|
357
359
|
if (cli.getSettingWithDefaultValue(settingsNames.autoOpenLinksInBrowser, false)) {
|
|
358
360
|
await browserUtil.open(response.verificationUri);
|
|
359
361
|
}
|
|
@@ -471,7 +473,7 @@ export class Auth {
|
|
|
471
473
|
}
|
|
472
474
|
if (userName && process.env.ACC_CLOUD) {
|
|
473
475
|
// reject for now since the Azure Cloud Shell does not support user-managed identity
|
|
474
|
-
|
|
476
|
+
throw 'Azure Cloud Shell does not support user-managed identity. You can execute the command without the --userName option to login with user identity';
|
|
475
477
|
}
|
|
476
478
|
requestOptions.url = `${process.env.IDENTITY_ENDPOINT}?resource=${encodeURIComponent(resource)}`;
|
|
477
479
|
}
|
|
@@ -481,7 +483,7 @@ export class Auth {
|
|
|
481
483
|
}
|
|
482
484
|
if (userName && process.env.ACC_CLOUD) {
|
|
483
485
|
// reject for now since the Azure Cloud Shell does not support user-managed identity
|
|
484
|
-
|
|
486
|
+
throw 'Azure Cloud Shell does not support user-managed identity. You can execute the command without the --userName option to login with user identity';
|
|
485
487
|
}
|
|
486
488
|
requestOptions.url = `${process.env.MSI_ENDPOINT}?resource=${encodeURIComponent(resource)}`;
|
|
487
489
|
}
|
package/dist/AuthServer.js
CHANGED
|
@@ -26,7 +26,7 @@ export class AuthServer {
|
|
|
26
26
|
await this.logger.logToStderr(url);
|
|
27
27
|
await this.logger.logToStderr('');
|
|
28
28
|
}
|
|
29
|
-
this.openUrl(url);
|
|
29
|
+
await this.openUrl(url);
|
|
30
30
|
};
|
|
31
31
|
this.httpRequest = async (request, response) => {
|
|
32
32
|
if (this.debug) {
|
|
@@ -80,19 +80,19 @@ export class AuthServer {
|
|
|
80
80
|
get server() {
|
|
81
81
|
return this.httpServer;
|
|
82
82
|
}
|
|
83
|
-
openUrl(url) {
|
|
84
|
-
|
|
85
|
-
.
|
|
83
|
+
async openUrl(url) {
|
|
84
|
+
try {
|
|
85
|
+
await browserUtil.open(url);
|
|
86
86
|
await this.logger.logToStderr("To sign in, use the web browser that just has been opened. Please sign-in there.");
|
|
87
|
-
}
|
|
88
|
-
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
89
|
const errorResponse = {
|
|
90
90
|
error: "Can't open the default browser",
|
|
91
91
|
errorDescription: "Was not able to open a browser instance. Try again later or use a different authentication method."
|
|
92
92
|
};
|
|
93
93
|
this.reject(errorResponse);
|
|
94
94
|
this.httpServer.close();
|
|
95
|
-
}
|
|
95
|
+
}
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
export default new AuthServer();
|
package/dist/Command.js
CHANGED
|
@@ -522,7 +522,10 @@ class Command {
|
|
|
522
522
|
quote: cli.getConfig().get(settingsNames.csvQuote),
|
|
523
523
|
quoted: cli.getSettingWithDefaultValue(settingsNames.csvQuoted, false),
|
|
524
524
|
// eslint-disable-next-line camelcase
|
|
525
|
-
quoted_empty: cli.getSettingWithDefaultValue(settingsNames.csvQuotedEmpty, false)
|
|
525
|
+
quoted_empty: cli.getSettingWithDefaultValue(settingsNames.csvQuotedEmpty, false),
|
|
526
|
+
cast: {
|
|
527
|
+
boolean: (value) => value ? '1' : '0'
|
|
528
|
+
}
|
|
526
529
|
});
|
|
527
530
|
}
|
|
528
531
|
getMdOutput(logStatement, command, options) {
|
package/dist/api.js
CHANGED
|
@@ -3,7 +3,7 @@ export async function executeCommand(commandName, options, listener) {
|
|
|
3
3
|
cli.loadAllCommandsInfo();
|
|
4
4
|
await cli.loadCommandFromArgs(commandName.split(' '));
|
|
5
5
|
if (!cli.commandToExecute) {
|
|
6
|
-
|
|
6
|
+
throw `Command not found: ${commandName}`;
|
|
7
7
|
}
|
|
8
8
|
return cli.executeCommandWithOutput(cli.commandToExecute.command, { options: options ?? {} }, listener);
|
|
9
9
|
}
|
package/dist/config.js
CHANGED
|
@@ -14,6 +14,7 @@ export default {
|
|
|
14
14
|
'https://graph.microsoft.com/ChannelMessage.Send',
|
|
15
15
|
'https://graph.microsoft.com/ChannelSettings.ReadWrite.All',
|
|
16
16
|
'https://graph.microsoft.com/Chat.ReadWrite',
|
|
17
|
+
'https://graph.microsoft.com/Community.ReadWrite.All',
|
|
17
18
|
'https://graph.microsoft.com/Directory.AccessAsUser.All',
|
|
18
19
|
'https://graph.microsoft.com/Directory.ReadWrite.All',
|
|
19
20
|
'https://graph.microsoft.com/ExternalConnection.ReadWrite.All',
|
|
@@ -31,8 +31,8 @@ class CliDoctorCommand extends Command {
|
|
|
31
31
|
},
|
|
32
32
|
cliVersion: app.packageJson().version,
|
|
33
33
|
nodeVersion: process.version,
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
cliEntraAppId: auth.connection.appId,
|
|
35
|
+
cliEntraAppTenant: validation.isValidGuid(auth.connection.tenant) ? 'single' : auth.connection.tenant,
|
|
36
36
|
authMode: auth.connection.authType,
|
|
37
37
|
cliEnvironment: process.env.CLIMICROSOFT365_ENV ? process.env.CLIMICROSOFT365_ENV : '',
|
|
38
38
|
cliConfig: cli.getConfig().all,
|
|
@@ -101,7 +101,7 @@ class LoginCommand extends Command {
|
|
|
101
101
|
auth.connection.authType = AuthType.Certificate;
|
|
102
102
|
auth.connection.certificate = getCertificate(args.options);
|
|
103
103
|
auth.connection.thumbprint = args.options.thumbprint;
|
|
104
|
-
auth.connection.password = args.options.password
|
|
104
|
+
auth.connection.password = args.options.password ?? cli.getConfig().get(settingsNames.clientCertificatePassword);
|
|
105
105
|
break;
|
|
106
106
|
case 'identity':
|
|
107
107
|
auth.connection.authType = AuthType.Identity;
|
|
@@ -3,7 +3,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
3
3
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
5
|
};
|
|
6
|
-
var _EntraM365GroupSetCommand_instances, _EntraM365GroupSetCommand_initTelemetry, _EntraM365GroupSetCommand_initOptions, _EntraM365GroupSetCommand_initTypes, _EntraM365GroupSetCommand_initValidators;
|
|
6
|
+
var _EntraM365GroupSetCommand_instances, _EntraM365GroupSetCommand_initTelemetry, _EntraM365GroupSetCommand_initOptions, _EntraM365GroupSetCommand_initOptionSets, _EntraM365GroupSetCommand_initTypes, _EntraM365GroupSetCommand_initValidators;
|
|
7
7
|
import { setTimeout } from 'timers/promises';
|
|
8
8
|
import fs from 'fs';
|
|
9
9
|
import path from 'path';
|
|
@@ -31,8 +31,9 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
31
31
|
this.pollingInterval = 500;
|
|
32
32
|
__classPrivateFieldGet(this, _EntraM365GroupSetCommand_instances, "m", _EntraM365GroupSetCommand_initTelemetry).call(this);
|
|
33
33
|
__classPrivateFieldGet(this, _EntraM365GroupSetCommand_instances, "m", _EntraM365GroupSetCommand_initOptions).call(this);
|
|
34
|
-
__classPrivateFieldGet(this, _EntraM365GroupSetCommand_instances, "m", _EntraM365GroupSetCommand_initTypes).call(this);
|
|
35
34
|
__classPrivateFieldGet(this, _EntraM365GroupSetCommand_instances, "m", _EntraM365GroupSetCommand_initValidators).call(this);
|
|
35
|
+
__classPrivateFieldGet(this, _EntraM365GroupSetCommand_instances, "m", _EntraM365GroupSetCommand_initOptionSets).call(this);
|
|
36
|
+
__classPrivateFieldGet(this, _EntraM365GroupSetCommand_instances, "m", _EntraM365GroupSetCommand_initTypes).call(this);
|
|
36
37
|
}
|
|
37
38
|
async commandAction(logger, args) {
|
|
38
39
|
await this.showDeprecationWarning(logger, aadCommands.M365GROUP_SET, commands.M365GROUP_SET);
|
|
@@ -40,23 +41,24 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
40
41
|
if ((args.options.allowExternalSenders !== undefined || args.options.autoSubscribeNewMembers !== undefined) && accessToken.isAppOnlyAccessToken(auth.connection.accessTokens[auth.defaultResource].accessToken)) {
|
|
41
42
|
throw `Option 'allowExternalSenders' and 'autoSubscribeNewMembers' can only be used when using delegated permissions.`;
|
|
42
43
|
}
|
|
43
|
-
const
|
|
44
|
+
const groupId = args.options.id || await entraGroup.getGroupIdByDisplayName(args.options.displayName);
|
|
45
|
+
const isUnifiedGroup = await entraGroup.isUnifiedGroup(groupId);
|
|
44
46
|
if (!isUnifiedGroup) {
|
|
45
|
-
throw Error(`Specified group with id '${
|
|
47
|
+
throw Error(`Specified group with id '${groupId}' is not a Microsoft 365 group.`);
|
|
46
48
|
}
|
|
47
49
|
if (this.verbose) {
|
|
48
|
-
await logger.logToStderr(`Updating Microsoft 365 Group ${args.options.id}...`);
|
|
50
|
+
await logger.logToStderr(`Updating Microsoft 365 Group ${args.options.id || args.options.displayName}...`);
|
|
49
51
|
}
|
|
50
|
-
if (args.options.
|
|
52
|
+
if (args.options.newDisplayName || args.options.description !== undefined || args.options.isPrivate !== undefined) {
|
|
51
53
|
const update = {
|
|
52
|
-
displayName: args.options.
|
|
54
|
+
displayName: args.options.newDisplayName,
|
|
53
55
|
description: args.options.description !== '' ? args.options.description : null
|
|
54
56
|
};
|
|
55
57
|
if (args.options.isPrivate !== undefined) {
|
|
56
58
|
update.visibility = args.options.isPrivate ? 'Private' : 'Public';
|
|
57
59
|
}
|
|
58
60
|
const requestOptions = {
|
|
59
|
-
url: `${this.resource}/v1.0/groups/${
|
|
61
|
+
url: `${this.resource}/v1.0/groups/${groupId}`,
|
|
60
62
|
headers: {
|
|
61
63
|
'accept': 'application/json;odata.metadata=none'
|
|
62
64
|
},
|
|
@@ -74,7 +76,7 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
74
76
|
hideFromOutlookClients: args.options.hideFromOutlookClients
|
|
75
77
|
};
|
|
76
78
|
const requestOptions = {
|
|
77
|
-
url: `${this.resource}/v1.0/groups/${
|
|
79
|
+
url: `${this.resource}/v1.0/groups/${groupId}`,
|
|
78
80
|
headers: {
|
|
79
81
|
accept: 'application/json;odata.metadata=none'
|
|
80
82
|
},
|
|
@@ -89,7 +91,7 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
89
91
|
await logger.logToStderr(`Setting group logo ${fullPath}...`);
|
|
90
92
|
}
|
|
91
93
|
const requestOptions = {
|
|
92
|
-
url: `${this.resource}/v1.0/groups/${
|
|
94
|
+
url: `${this.resource}/v1.0/groups/${groupId}/photo/$value`,
|
|
93
95
|
headers: {
|
|
94
96
|
'content-type': this.getImageContentType(fullPath)
|
|
95
97
|
},
|
|
@@ -114,7 +116,7 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
114
116
|
};
|
|
115
117
|
const res = await request.get(requestOptions);
|
|
116
118
|
await Promise.all(res.value.map(u => request.post({
|
|
117
|
-
url: `${this.resource}/v1.0/groups/${
|
|
119
|
+
url: `${this.resource}/v1.0/groups/${groupId}/owners/$ref`,
|
|
118
120
|
headers: {
|
|
119
121
|
'content-type': 'application/json'
|
|
120
122
|
},
|
|
@@ -141,7 +143,7 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
141
143
|
};
|
|
142
144
|
const res = await request.get(requestOptions);
|
|
143
145
|
await Promise.all(res.value.map(u => request.post({
|
|
144
|
-
url: `${this.resource}/v1.0/groups/${
|
|
146
|
+
url: `${this.resource}/v1.0/groups/${groupId}/members/$ref`,
|
|
145
147
|
headers: {
|
|
146
148
|
'content-type': 'application/json'
|
|
147
149
|
},
|
|
@@ -188,7 +190,9 @@ class EntraM365GroupSetCommand extends GraphCommand {
|
|
|
188
190
|
_EntraM365GroupSetCommand_instances = new WeakSet(), _EntraM365GroupSetCommand_initTelemetry = function _EntraM365GroupSetCommand_initTelemetry() {
|
|
189
191
|
this.telemetry.push((args) => {
|
|
190
192
|
Object.assign(this.telemetryProperties, {
|
|
193
|
+
id: typeof args.options.id !== 'undefined',
|
|
191
194
|
displayName: typeof args.options.displayName !== 'undefined',
|
|
195
|
+
newDisplayName: typeof args.options.newDisplayName !== 'undefined',
|
|
192
196
|
description: typeof args.options.description !== 'undefined',
|
|
193
197
|
owners: typeof args.options.owners !== 'undefined',
|
|
194
198
|
members: typeof args.options.members !== 'undefined',
|
|
@@ -202,9 +206,11 @@ _EntraM365GroupSetCommand_instances = new WeakSet(), _EntraM365GroupSetCommand_i
|
|
|
202
206
|
});
|
|
203
207
|
}, _EntraM365GroupSetCommand_initOptions = function _EntraM365GroupSetCommand_initOptions() {
|
|
204
208
|
this.options.unshift({
|
|
205
|
-
option: '-i, --id
|
|
209
|
+
option: '-i, --id [id]'
|
|
206
210
|
}, {
|
|
207
211
|
option: '-n, --displayName [displayName]'
|
|
212
|
+
}, {
|
|
213
|
+
option: '--newDisplayName [newDisplayName]'
|
|
208
214
|
}, {
|
|
209
215
|
option: '-d, --description [description]'
|
|
210
216
|
}, {
|
|
@@ -229,12 +235,14 @@ _EntraM365GroupSetCommand_instances = new WeakSet(), _EntraM365GroupSetCommand_i
|
|
|
229
235
|
option: '--hideFromOutlookClients [hideFromOutlookClients]',
|
|
230
236
|
autocomplete: ['true', 'false']
|
|
231
237
|
});
|
|
238
|
+
}, _EntraM365GroupSetCommand_initOptionSets = function _EntraM365GroupSetCommand_initOptionSets() {
|
|
239
|
+
this.optionSets.push({ options: ['id', 'displayName'] });
|
|
232
240
|
}, _EntraM365GroupSetCommand_initTypes = function _EntraM365GroupSetCommand_initTypes() {
|
|
233
241
|
this.types.boolean.push('isPrivate', 'allowEternalSenders', 'autoSubscribeNewMembers', 'hideFromAddressLists', 'hideFromOutlookClients');
|
|
234
|
-
this.types.string.push('id', 'displayName', 'description', 'owners', 'members', 'logoPath');
|
|
242
|
+
this.types.string.push('id', 'displayName', 'newDisplayName', 'description', 'owners', 'members', 'logoPath');
|
|
235
243
|
}, _EntraM365GroupSetCommand_initValidators = function _EntraM365GroupSetCommand_initValidators() {
|
|
236
244
|
this.validators.push(async (args) => {
|
|
237
|
-
if (!args.options.
|
|
245
|
+
if (!args.options.newDisplayName &&
|
|
238
246
|
args.options.description === undefined &&
|
|
239
247
|
!args.options.members &&
|
|
240
248
|
!args.options.owners &&
|
|
@@ -246,7 +254,7 @@ _EntraM365GroupSetCommand_instances = new WeakSet(), _EntraM365GroupSetCommand_i
|
|
|
246
254
|
args.options.hideFromOutlookClients === undefined) {
|
|
247
255
|
return 'Specify at least one option to update.';
|
|
248
256
|
}
|
|
249
|
-
if (!validation.isValidGuid(args.options.id)) {
|
|
257
|
+
if (args.options.id && !validation.isValidGuid(args.options.id)) {
|
|
250
258
|
return `${args.options.id} is not a valid GUID`;
|
|
251
259
|
}
|
|
252
260
|
if (args.options.owners) {
|
|
@@ -35,19 +35,15 @@ class EntraM365GroupUserAddCommand extends GraphCommand {
|
|
|
35
35
|
}
|
|
36
36
|
async commandAction(logger, args) {
|
|
37
37
|
await this.showDeprecationWarning(logger, aadCommands.M365GROUP_USER_ADD, commands.M365GROUP_USER_ADD);
|
|
38
|
-
if (args.options.userName) {
|
|
39
|
-
await this.warn(logger, `Option 'userName' is deprecated. Please use 'ids' or 'userNames' instead.`);
|
|
40
|
-
}
|
|
41
38
|
try {
|
|
42
|
-
const userNames = args.options.userNames || args.options.userName;
|
|
43
39
|
const providedGroupId = await this.getGroupId(logger, args);
|
|
44
40
|
const isUnifiedGroup = await entraGroup.isUnifiedGroup(providedGroupId);
|
|
45
41
|
if (!isUnifiedGroup) {
|
|
46
42
|
throw Error(`Specified group with id '${providedGroupId}' is not a Microsoft 365 group.`);
|
|
47
43
|
}
|
|
48
|
-
const userIds = await this.getUserIds(logger, args.options.ids, userNames);
|
|
44
|
+
const userIds = await this.getUserIds(logger, args.options.ids, args.options.userNames);
|
|
49
45
|
if (this.verbose) {
|
|
50
|
-
await logger.logToStderr(`Adding user(s) ${args.options.ids || userNames} to group ${args.options.groupId || args.options.groupName || args.options.teamId || args.options.teamName}...`);
|
|
46
|
+
await logger.logToStderr(`Adding user(s) ${args.options.ids || args.options.userNames} to group ${args.options.groupId || args.options.groupName || args.options.teamId || args.options.teamName}...`);
|
|
51
47
|
}
|
|
52
48
|
await this.addUsers(providedGroupId, userIds, args.options.role);
|
|
53
49
|
}
|
|
@@ -122,14 +118,11 @@ _EntraM365GroupUserAddCommand_instances = new WeakSet(), _EntraM365GroupUserAddC
|
|
|
122
118
|
teamName: typeof args.options.teamName !== 'undefined',
|
|
123
119
|
groupName: typeof args.options.groupName !== 'undefined',
|
|
124
120
|
ids: typeof args.options.ids !== 'undefined',
|
|
125
|
-
userNames: typeof args.options.userNames !== 'undefined'
|
|
126
|
-
userName: typeof args.options.userName !== 'undefined'
|
|
121
|
+
userNames: typeof args.options.userNames !== 'undefined'
|
|
127
122
|
});
|
|
128
123
|
});
|
|
129
124
|
}, _EntraM365GroupUserAddCommand_initOptions = function _EntraM365GroupUserAddCommand_initOptions() {
|
|
130
125
|
this.options.unshift({
|
|
131
|
-
option: '-n, --userName [userName]'
|
|
132
|
-
}, {
|
|
133
126
|
option: '--ids [ids]'
|
|
134
127
|
}, {
|
|
135
128
|
option: '--userNames [userNames]'
|
|
@@ -172,9 +165,9 @@ _EntraM365GroupUserAddCommand_instances = new WeakSet(), _EntraM365GroupUserAddC
|
|
|
172
165
|
});
|
|
173
166
|
}, _EntraM365GroupUserAddCommand_initOptionSets = function _EntraM365GroupUserAddCommand_initOptionSets() {
|
|
174
167
|
this.optionSets.push({ options: ['groupId', 'groupName', 'teamId', 'teamName'] });
|
|
175
|
-
this.optionSets.push({ options: ['
|
|
168
|
+
this.optionSets.push({ options: ['ids', 'userNames'] });
|
|
176
169
|
}, _EntraM365GroupUserAddCommand_initTypes = function _EntraM365GroupUserAddCommand_initTypes() {
|
|
177
|
-
this.types.string.push('
|
|
170
|
+
this.types.string.push('ids', 'userNames', 'groupId', 'groupName', 'teamId', 'teamName', 'role');
|
|
178
171
|
};
|
|
179
172
|
export default new EntraM365GroupUserAddCommand();
|
|
180
173
|
//# sourceMappingURL=m365group-user-add.js.map
|
|
@@ -4,8 +4,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
4
4
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
5
|
};
|
|
6
6
|
var _EntraOAuth2GrantListCommand_instances, _EntraOAuth2GrantListCommand_initOptions, _EntraOAuth2GrantListCommand_initValidators;
|
|
7
|
-
import request from '../../../../request.js';
|
|
8
7
|
import { formatting } from '../../../../utils/formatting.js';
|
|
8
|
+
import { odata } from '../../../../utils/odata.js';
|
|
9
9
|
import { validation } from '../../../../utils/validation.js';
|
|
10
10
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
11
11
|
import aadCommands from '../../aadCommands.js';
|
|
@@ -35,17 +35,8 @@ class EntraOAuth2GrantListCommand extends GraphCommand {
|
|
|
35
35
|
await logger.logToStderr(`Retrieving list of OAuth grants for the service principal...`);
|
|
36
36
|
}
|
|
37
37
|
try {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
headers: {
|
|
41
|
-
accept: 'application/json;odata.metadata=none'
|
|
42
|
-
},
|
|
43
|
-
responseType: 'json'
|
|
44
|
-
};
|
|
45
|
-
const res = await request.get(requestOptions);
|
|
46
|
-
if (res.value && res.value.length > 0) {
|
|
47
|
-
await logger.log(res.value);
|
|
48
|
-
}
|
|
38
|
+
const res = await odata.getAllItems(`${this.resource}/v1.0/oauth2PermissionGrants?$filter=clientId eq '${formatting.encodeQueryParameter(args.options.spObjectId)}'`);
|
|
39
|
+
await logger.log(res);
|
|
49
40
|
}
|
|
50
41
|
catch (err) {
|
|
51
42
|
this.handleRejectedODataJsonPromise(err);
|
|
@@ -45,8 +45,7 @@ class ExternalItemAddCommand extends GraphCommand {
|
|
|
45
45
|
properties: {}
|
|
46
46
|
};
|
|
47
47
|
// we need to rewrite the @odata properties to the correct format
|
|
48
|
-
//
|
|
49
|
-
// we also need to extract multiple values for collections into arrays
|
|
48
|
+
// to extract multiple values for collections into arrays
|
|
50
49
|
this.rewriteCollectionProperties(args.options);
|
|
51
50
|
this.addUnknownOptionsToPayload(requestBody.properties, args.options);
|
|
52
51
|
const requestOptions = {
|
|
@@ -81,11 +80,9 @@ class ExternalItemAddCommand extends GraphCommand {
|
|
|
81
80
|
}
|
|
82
81
|
rewriteCollectionProperties(options) {
|
|
83
82
|
Object.getOwnPropertyNames(options).forEach(name => {
|
|
84
|
-
if (!name.
|
|
83
|
+
if (!name.includes('@odata')) {
|
|
85
84
|
return;
|
|
86
85
|
}
|
|
87
|
-
options[`${name}.type`] = options[name].type;
|
|
88
|
-
delete options[name];
|
|
89
86
|
// convert the value of a collection to an array
|
|
90
87
|
const nameWithoutOData = name.substring(0, name.indexOf('@odata'));
|
|
91
88
|
if (options[nameWithoutOData]) {
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
6
|
+
var _FileMoveCommand_instances, _FileMoveCommand_initTelemetry, _FileMoveCommand_initOptions, _FileMoveCommand_initValidators;
|
|
7
|
+
import GraphCommand from '../../base/GraphCommand.js';
|
|
8
|
+
import { setTimeout } from 'timers/promises';
|
|
9
|
+
import commands from '../commands.js';
|
|
10
|
+
import request from '../../../request.js';
|
|
11
|
+
import { spo } from '../../../utils/spo.js';
|
|
12
|
+
import { urlUtil } from '../../../utils/urlUtil.js';
|
|
13
|
+
import { driveUtil } from '../../../utils/driveUtil.js';
|
|
14
|
+
import { validation } from '../../../utils/validation.js';
|
|
15
|
+
class FileMoveCommand extends GraphCommand {
|
|
16
|
+
get name() {
|
|
17
|
+
return commands.MOVE;
|
|
18
|
+
}
|
|
19
|
+
get description() {
|
|
20
|
+
return 'Moves a file to another location using the Microsoft Graph';
|
|
21
|
+
}
|
|
22
|
+
constructor() {
|
|
23
|
+
super();
|
|
24
|
+
_FileMoveCommand_instances.add(this);
|
|
25
|
+
this.pollingInterval = 10000;
|
|
26
|
+
this.nameConflictBehaviorOptions = ['fail', 'replace', 'rename'];
|
|
27
|
+
__classPrivateFieldGet(this, _FileMoveCommand_instances, "m", _FileMoveCommand_initTelemetry).call(this);
|
|
28
|
+
__classPrivateFieldGet(this, _FileMoveCommand_instances, "m", _FileMoveCommand_initOptions).call(this);
|
|
29
|
+
__classPrivateFieldGet(this, _FileMoveCommand_instances, "m", _FileMoveCommand_initValidators).call(this);
|
|
30
|
+
}
|
|
31
|
+
async commandAction(logger, args) {
|
|
32
|
+
try {
|
|
33
|
+
const { webUrl, sourceUrl, targetUrl, nameConflictBehavior, newName, verbose } = args.options;
|
|
34
|
+
const sourcePath = this.getAbsoluteUrl(webUrl, sourceUrl);
|
|
35
|
+
const destinationPath = this.getAbsoluteUrl(webUrl, targetUrl);
|
|
36
|
+
const { driveId, itemId } = await this.getDriveIdAndItemId(webUrl, sourcePath, sourceUrl, logger, verbose);
|
|
37
|
+
const targetSiteUrl = urlUtil.getTargetSiteAbsoluteUrl(webUrl, targetUrl);
|
|
38
|
+
const targetFolderUrl = this.getAbsoluteUrl(targetSiteUrl, targetUrl);
|
|
39
|
+
const { driveId: targetDriveId, itemId: targetItemId } = await this.getDriveIdAndItemId(targetSiteUrl, targetFolderUrl, targetUrl, logger, verbose);
|
|
40
|
+
const requestOptions = this.getRequestOptions(driveId, itemId, targetDriveId, targetItemId, newName, sourcePath, nameConflictBehavior);
|
|
41
|
+
if (verbose) {
|
|
42
|
+
await logger.logToStderr(`Moving file '${sourcePath}' to '${destinationPath}'...`);
|
|
43
|
+
}
|
|
44
|
+
if (driveId === targetDriveId) {
|
|
45
|
+
await request.patch(requestOptions);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const response = await request.post(requestOptions);
|
|
49
|
+
await this.waitUntilCopyOperationCompleted(response.headers.location, logger);
|
|
50
|
+
const itemUrl = `${this.resource}/v1.0/drives/${driveId}/items/${itemId}`;
|
|
51
|
+
await request.delete({ url: itemUrl, headers: requestOptions.headers });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
this.handleRejectedODataJsonPromise(err);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
getAbsoluteUrl(webUrl, url) {
|
|
59
|
+
return url.startsWith('https://') ? url : urlUtil.getAbsoluteUrl(webUrl, url);
|
|
60
|
+
}
|
|
61
|
+
async getDriveIdAndItemId(webUrl, folderUrl, sourceUrl, logger, verbose) {
|
|
62
|
+
const siteId = await spo.getSiteId(webUrl, logger, verbose);
|
|
63
|
+
const drive = await driveUtil.getDriveByUrl(siteId, new URL(folderUrl));
|
|
64
|
+
const itemId = await driveUtil.getDriveItemId(drive, new URL(folderUrl));
|
|
65
|
+
return { driveId: drive.id, itemId };
|
|
66
|
+
}
|
|
67
|
+
getRequestOptions(sourceDriveId, sourceItemId, targetDriveId, targetItemId, newName, sourcePath, nameConflictBehavior) {
|
|
68
|
+
const apiUrl = sourceDriveId === targetDriveId
|
|
69
|
+
? `${this.resource}/v1.0/drives/${sourceDriveId}/items/${sourceItemId}`
|
|
70
|
+
: `${this.resource}/v1.0/drives/${sourceDriveId}/items/${sourceItemId}/copy`;
|
|
71
|
+
const queryParameters = nameConflictBehavior && nameConflictBehavior !== 'fail'
|
|
72
|
+
? `@microsoft.graph.conflictBehavior=${nameConflictBehavior}`
|
|
73
|
+
: '';
|
|
74
|
+
const urlWithQuery = `${apiUrl}${queryParameters ? `?${queryParameters}` : ''}`;
|
|
75
|
+
const requestOptions = {
|
|
76
|
+
url: urlWithQuery,
|
|
77
|
+
headers: { accept: 'application/json;odata.metadata=none' },
|
|
78
|
+
responseType: 'json',
|
|
79
|
+
fullResponse: true,
|
|
80
|
+
data: { parentReference: { driveId: targetDriveId, id: targetItemId } }
|
|
81
|
+
};
|
|
82
|
+
if (newName) {
|
|
83
|
+
const sourceFileName = sourcePath.substring(sourcePath.lastIndexOf('/') + 1);
|
|
84
|
+
const sourceFileExtension = sourceFileName.includes('.') ? sourceFileName.substring(sourceFileName.lastIndexOf('.')) : '';
|
|
85
|
+
const newNameExtension = newName.includes('.') ? newName.substring(newName.lastIndexOf('.')) : '';
|
|
86
|
+
requestOptions.data.name = newNameExtension ? `${newName.replace(newNameExtension, "")}${sourceFileExtension}` : `${newName}${sourceFileExtension}`;
|
|
87
|
+
}
|
|
88
|
+
return requestOptions;
|
|
89
|
+
}
|
|
90
|
+
async waitUntilCopyOperationCompleted(monitorUrl, logger) {
|
|
91
|
+
const requestOptions = {
|
|
92
|
+
url: monitorUrl,
|
|
93
|
+
responseType: 'json'
|
|
94
|
+
};
|
|
95
|
+
const response = await request.get(requestOptions);
|
|
96
|
+
if (response.status === 'completed') {
|
|
97
|
+
if (this.verbose) {
|
|
98
|
+
await logger.logToStderr('Copy operation completed succesfully. Returning...');
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
else if (response.status === 'failed') {
|
|
103
|
+
throw response.error.message;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
if (this.verbose) {
|
|
107
|
+
await logger.logToStderr(`Still copying. Retrying in ${this.pollingInterval / 1000} seconds...`);
|
|
108
|
+
}
|
|
109
|
+
await setTimeout(this.pollingInterval);
|
|
110
|
+
await this.waitUntilCopyOperationCompleted(monitorUrl, logger);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
_FileMoveCommand_instances = new WeakSet(), _FileMoveCommand_initTelemetry = function _FileMoveCommand_initTelemetry() {
|
|
115
|
+
this.telemetry.push((args) => {
|
|
116
|
+
Object.assign(this.telemetryProperties, {
|
|
117
|
+
webUrl: typeof args.options.webUrl !== 'undefined',
|
|
118
|
+
sourceUrl: typeof args.options.sourceUrl !== 'undefined',
|
|
119
|
+
targetUrl: typeof args.options.targetUrl !== 'undefined',
|
|
120
|
+
newName: typeof args.options.newName !== 'undefined',
|
|
121
|
+
nameConflictBehavior: typeof args.options.nameConflictBehavior !== 'undefined'
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}, _FileMoveCommand_initOptions = function _FileMoveCommand_initOptions() {
|
|
125
|
+
this.options.unshift({ option: '-u, --webUrl <webUrl>' }, { option: '-s, --sourceUrl <sourceUrl>' }, { option: '-t, --targetUrl <targetUrl>' }, { option: '--newName [newName]' }, { option: '--nameConflictBehavior [nameConflictBehavior]', autocomplete: this.nameConflictBehaviorOptions });
|
|
126
|
+
}, _FileMoveCommand_initValidators = function _FileMoveCommand_initValidators() {
|
|
127
|
+
this.validators.push(async (args) => {
|
|
128
|
+
if (args.options.nameConflictBehavior && this.nameConflictBehaviorOptions.indexOf(args.options.nameConflictBehavior) === -1) {
|
|
129
|
+
return `${args.options.nameConflictBehavior} is not a valid nameConflictBehavior value. Allowed values: ${this.nameConflictBehaviorOptions.join(', ')}.`;
|
|
130
|
+
}
|
|
131
|
+
return validation.isValidSharePointUrl(args.options.webUrl);
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
export default new FileMoveCommand();
|
|
135
|
+
//# sourceMappingURL=file-move.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import PowerAutomateCommand from '../../../base/PowerAutomateCommand.js';
|
|
2
|
+
import { globalOptionsZod } from '../../../../Command.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { zod } from '../../../../utils/zod.js';
|
|
5
|
+
import commands from '../../commands.js';
|
|
6
|
+
import { formatting } from '../../../../utils/formatting.js';
|
|
7
|
+
import { odata } from '../../../../utils/odata.js';
|
|
8
|
+
import { cli } from '../../../../cli/cli.js';
|
|
9
|
+
const options = globalOptionsZod
|
|
10
|
+
.extend({
|
|
11
|
+
environmentName: zod.alias('e', z.string())
|
|
12
|
+
})
|
|
13
|
+
.strict();
|
|
14
|
+
class FlowRecycleBinItemListCommand extends PowerAutomateCommand {
|
|
15
|
+
get name() {
|
|
16
|
+
return commands.RECYCLEBINITEM_LIST;
|
|
17
|
+
}
|
|
18
|
+
get description() {
|
|
19
|
+
return 'Lists all soft-deleted Power Automate flows within an environment';
|
|
20
|
+
}
|
|
21
|
+
defaultProperties() {
|
|
22
|
+
return ['name', 'displayName'];
|
|
23
|
+
}
|
|
24
|
+
get schema() {
|
|
25
|
+
return options;
|
|
26
|
+
}
|
|
27
|
+
async commandAction(logger, args) {
|
|
28
|
+
try {
|
|
29
|
+
if (this.verbose) {
|
|
30
|
+
await logger.logToStderr(`Getting list of soft-deleted flows in environment ${args.options.environmentName}...`);
|
|
31
|
+
}
|
|
32
|
+
const flows = await odata.getAllItems(`${PowerAutomateCommand.resource}/providers/Microsoft.ProcessSimple/scopes/admin/environments/${formatting.encodeQueryParameter(args.options.environmentName)}/v2/flows?api-version=2016-11-01&include=softDeletedFlows`);
|
|
33
|
+
const deletedFlows = flows.filter(flow => flow.properties.state === 'Deleted');
|
|
34
|
+
if (cli.shouldTrimOutput(args.options.output)) {
|
|
35
|
+
deletedFlows.forEach(flow => {
|
|
36
|
+
flow.displayName = flow.properties.displayName;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
await logger.log(deletedFlows);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
this.handleRejectedODataJsonPromise(err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export default new FlowRecycleBinItemListCommand();
|
|
47
|
+
//# sourceMappingURL=recyclebinitem-list.js.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import PowerAutomateCommand from '../../../base/PowerAutomateCommand.js';
|
|
2
|
+
import { globalOptionsZod } from '../../../../Command.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { zod } from '../../../../utils/zod.js';
|
|
5
|
+
import commands from '../../commands.js';
|
|
6
|
+
import { validation } from '../../../../utils/validation.js';
|
|
7
|
+
import { formatting } from '../../../../utils/formatting.js';
|
|
8
|
+
import request from '../../../../request.js';
|
|
9
|
+
const options = globalOptionsZod
|
|
10
|
+
.extend({
|
|
11
|
+
environmentName: zod.alias('e', z.string()),
|
|
12
|
+
flowName: zod.alias('n', z.string()
|
|
13
|
+
.refine(name => validation.isValidGuid(name), name => ({
|
|
14
|
+
message: `'${name}' is not a valid GUID.`
|
|
15
|
+
})))
|
|
16
|
+
})
|
|
17
|
+
.strict();
|
|
18
|
+
class FlowRecycleBinItemRestoreCommand extends PowerAutomateCommand {
|
|
19
|
+
get name() {
|
|
20
|
+
return commands.RECYCLEBINITEM_RESTORE;
|
|
21
|
+
}
|
|
22
|
+
get description() {
|
|
23
|
+
return 'Restores a soft-deleted Power Automate flow';
|
|
24
|
+
}
|
|
25
|
+
get schema() {
|
|
26
|
+
return options;
|
|
27
|
+
}
|
|
28
|
+
async commandAction(logger, args) {
|
|
29
|
+
try {
|
|
30
|
+
if (this.verbose) {
|
|
31
|
+
await logger.logToStderr(`Restoring soft-deleted flow ${args.options.flowName} from environment ${args.options.environmentName}...`);
|
|
32
|
+
}
|
|
33
|
+
const requestOptions = {
|
|
34
|
+
url: `${PowerAutomateCommand.resource}/providers/Microsoft.ProcessSimple/scopes/admin/environments/${formatting.encodeQueryParameter(args.options.environmentName)}/flows/${args.options.flowName}/restore?api-version=2016-11-01`,
|
|
35
|
+
headers: {
|
|
36
|
+
accept: 'application/json'
|
|
37
|
+
},
|
|
38
|
+
responseType: 'json'
|
|
39
|
+
};
|
|
40
|
+
await request.post(requestOptions);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
this.handleRejectedODataJsonPromise(err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export default new FlowRecycleBinItemRestoreCommand();
|
|
48
|
+
//# sourceMappingURL=recyclebinitem-restore.js.map
|
|
@@ -12,6 +12,8 @@ export default {
|
|
|
12
12
|
OWNER_ENSURE: `${prefix} owner ensure`,
|
|
13
13
|
OWNER_LIST: `${prefix} owner list`,
|
|
14
14
|
OWNER_REMOVE: `${prefix} owner remove`,
|
|
15
|
+
RECYCLEBINITEM_LIST: `${prefix} recyclebinitem list`,
|
|
16
|
+
RECYCLEBINITEM_RESTORE: `${prefix} recyclebinitem restore`,
|
|
15
17
|
REMOVE: `${prefix} remove`,
|
|
16
18
|
RUN_CANCEL: `${prefix} run cancel`,
|
|
17
19
|
RUN_GET: `${prefix} run get`,
|