@pnp/cli-microsoft365 8.0.0-beta.e6f9331 → 8.1.0-beta.3a80e6f
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/.eslintrc.cjs +1 -0
- package/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Auth.js +10 -18
- package/dist/Command.js +49 -2
- package/dist/chili/chili.js +0 -23
- package/dist/cli/cli.js +61 -101
- package/dist/m365/commands/login.js +44 -96
- package/dist/m365/commands/setup.js +0 -4
- package/dist/m365/connection/commands/connection-remove.js +6 -2
- package/dist/m365/connection/commands/connection-set.js +4 -1
- package/dist/m365/connection/commands/connection-use.js +25 -4
- package/dist/m365/entra/commands/m365group/m365group-set.js +66 -29
- package/dist/m365/entra/commands/m365group/m365group-user-add.js +109 -32
- package/dist/m365/entra/commands/m365group/m365group-user-set.js +159 -84
- package/dist/m365/entra/commands/multitenant/MultitenantOrganization.js +2 -0
- package/dist/m365/entra/commands/multitenant/multitenant-add.js +65 -0
- package/dist/m365/entra/commands/multitenant/multitenant-get.js +32 -0
- package/dist/m365/entra/commands/multitenant/multitenant-remove.js +118 -0
- package/dist/m365/entra/commands/multitenant/multitenant-set.js +72 -0
- package/dist/m365/entra/commands.js +4 -0
- package/dist/m365/external/commands/connection/connection-doctor.js +10 -24
- package/dist/m365/flow/commands/flow-get.js +1 -1
- package/dist/m365/flow/commands/flow-list.js +2 -1
- package/dist/m365/graph/commands/subscription/subscription-add.js +4 -2
- package/dist/m365/spe/ContainerTypeProperties.js +2 -0
- package/dist/m365/spe/commands/containertype/containertype-list.js +49 -0
- package/dist/m365/spe/commands.js +2 -1
- package/dist/m365/spfx/commands/project/base-project-command.js +36 -126
- package/dist/m365/spo/commands/applicationcustomizer/applicationcustomizer-get.js +16 -21
- package/dist/m365/spo/commands/commandset/commandset-get.js +31 -17
- package/dist/m365/spo/commands/contenttype/contenttype-field-list.js +124 -0
- package/dist/m365/spo/commands/field/field-list.js +1 -1
- package/dist/m365/spo/commands/file/file-roleassignment-add.js +1 -1
- package/dist/m365/spo/commands/file/file-roleinheritance-break.js +1 -1
- package/dist/m365/spo/commands/file/file-roleinheritance-reset.js +1 -1
- package/dist/m365/spo/commands/folder/folder-retentionlabel-ensure.js +1 -1
- package/dist/m365/spo/commands/folder/folder-sharinglink-get.js +86 -0
- package/dist/m365/spo/commands/folder/folder-sharinglink-list.js +110 -0
- package/dist/m365/spo/commands/list/ListInstance.js +6 -1
- package/dist/m365/spo/commands/list/list-get.js +9 -3
- package/dist/m365/spo/commands/list/list-roleassignment-add.js +46 -21
- package/dist/m365/spo/commands/list/list-roleassignment-remove.js +48 -46
- package/dist/m365/spo/commands/page/page-clientsidewebpart-add.js +2 -3
- package/dist/m365/spo/commands/page/page-text-add.js +2 -3
- package/dist/m365/spo/commands/spo-search.js +3 -4
- package/dist/m365/spo/commands/tenant/tenant-applicationcustomizer-get.js +19 -5
- package/dist/m365/spo/commands/tenant/tenant-commandset-get.js +20 -6
- package/dist/m365/spo/commands.js +3 -0
- package/dist/m365/teams/commands/meeting/meeting-attendancereport-get.js +119 -0
- package/dist/m365/teams/commands/message/message-remove.js +112 -0
- package/dist/m365/teams/commands.js +2 -0
- package/dist/m365/viva/commands/engage/engage-community-add.js +166 -0
- package/dist/m365/viva/commands.js +1 -0
- package/dist/utils/drive.js +61 -0
- package/dist/utils/formatting.js +30 -1
- package/dist/utils/spo.js +69 -6
- package/dist/utils/teams.js +49 -0
- package/dist/utils/zod.js +124 -0
- package/docs/docs/cmd/connection/connection-use.mdx +8 -2
- package/docs/docs/cmd/entra/m365group/m365group-set.mdx +37 -7
- package/docs/docs/cmd/entra/m365group/m365group-user-add.mdx +28 -10
- package/docs/docs/cmd/entra/m365group/m365group-user-set.mdx +35 -11
- package/docs/docs/cmd/entra/multitenant/multitenant-add.mdx +107 -0
- package/docs/docs/cmd/entra/multitenant/multitenant-get.mdx +94 -0
- package/docs/docs/cmd/entra/multitenant/multitenant-remove.mdx +58 -0
- package/docs/docs/cmd/entra/multitenant/multitenant-set.mdx +53 -0
- package/docs/docs/cmd/external/connection/connection-doctor.mdx +9 -9
- package/docs/docs/cmd/flow/flow-get.mdx +149 -283
- package/docs/docs/cmd/graph/subscription/subscription-add.mdx +18 -0
- package/docs/docs/cmd/planner/plan/plan-remove.mdx +1 -1
- package/docs/docs/cmd/spe/containertype/containertype-list.mdx +102 -0
- package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-get.mdx +87 -38
- package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-list.mdx +22 -28
- package/docs/docs/cmd/spo/commandset/commandset-get.mdx +75 -24
- package/docs/docs/cmd/spo/commandset/commandset-list.mdx +26 -32
- package/docs/docs/cmd/spo/contenttype/contenttype-field-list.mdx +172 -0
- package/docs/docs/cmd/spo/contenttype/contenttype-list.mdx +3 -3
- package/docs/docs/cmd/spo/field/field-list.mdx +3 -3
- package/docs/docs/cmd/spo/file/file-retentionlabel-ensure.mdx +1 -1
- package/docs/docs/cmd/spo/file/file-roleassignment-add.mdx +2 -2
- package/docs/docs/cmd/spo/file/file-roleassignment-remove.mdx +1 -1
- package/docs/docs/cmd/spo/file/file-roleinheritance-break.mdx +1 -1
- package/docs/docs/cmd/spo/file/file-roleinheritance-reset.mdx +1 -1
- package/docs/docs/cmd/spo/folder/folder-retentionlabel-ensure.mdx +2 -2
- package/docs/docs/cmd/spo/folder/folder-sharinglink-get.mdx +110 -0
- package/docs/docs/cmd/spo/folder/folder-sharinglink-list.mdx +114 -0
- package/docs/docs/cmd/spo/list/list-get.mdx +6 -0
- package/docs/docs/cmd/spo/list/list-roleassignment-add.mdx +15 -3
- package/docs/docs/cmd/spo/list/list-roleassignment-remove.mdx +15 -3
- package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-ensure.mdx +4 -4
- package/docs/docs/cmd/spo/listitem/listitem-retentionlabel-remove.mdx +1 -1
- package/docs/docs/cmd/spo/listitem/listitem-roleassignment-add.mdx +9 -9
- package/docs/docs/cmd/spo/listitem/listitem-roleassignment-remove.mdx +7 -7
- package/docs/docs/cmd/spo/site/site-recyclebinitem-list.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-get.mdx +79 -30
- package/docs/docs/cmd/spo/tenant/tenant-applicationcustomizer-list.mdx +20 -19
- package/docs/docs/cmd/spo/tenant/tenant-commandset-get.mdx +84 -38
- package/docs/docs/cmd/spo/tenant/tenant-commandset-list.mdx +20 -19
- package/docs/docs/cmd/spo/web/web-roleassignment-add.mdx +1 -1
- package/docs/docs/cmd/spo/web/web-roleassignment-remove.mdx +1 -1
- package/docs/docs/cmd/teams/meeting/meeting-attendancereport-get.mdx +138 -0
- package/docs/docs/cmd/teams/meeting/meeting-list.mdx +7 -3
- package/docs/docs/cmd/teams/message/message-remove.mdx +63 -0
- package/docs/docs/cmd/viva/engage/engage-community-add.mdx +168 -0
- package/npm-shrinkwrap.json +590 -1024
- package/package.json +7 -3
|
@@ -0,0 +1,119 @@
|
|
|
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 _TeamsMeetingAttendancereportGetCommand_instances, _TeamsMeetingAttendancereportGetCommand_initTelemetry, _TeamsMeetingAttendancereportGetCommand_initOptions, _TeamsMeetingAttendancereportGetCommand_initTypes, _TeamsMeetingAttendancereportGetCommand_initValidators, _TeamsMeetingAttendancereportGetCommand_initOptionSets;
|
|
7
|
+
import auth from '../../../../Auth.js';
|
|
8
|
+
import { accessToken } from '../../../../utils/accessToken.js';
|
|
9
|
+
import { validation } from '../../../../utils/validation.js';
|
|
10
|
+
import GraphCommand from "../../../base/GraphCommand.js";
|
|
11
|
+
import commands from '../../commands.js';
|
|
12
|
+
import { entraUser } from '../../../../utils/entraUser.js';
|
|
13
|
+
import request from '../../../../request.js';
|
|
14
|
+
class TeamsMeetingAttendancereportGetCommand extends GraphCommand {
|
|
15
|
+
get name() {
|
|
16
|
+
return commands.MEETING_ATTENDANCEREPORT_GET;
|
|
17
|
+
}
|
|
18
|
+
get description() {
|
|
19
|
+
return 'Gets attendance report for a given meeting';
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
super();
|
|
23
|
+
_TeamsMeetingAttendancereportGetCommand_instances.add(this);
|
|
24
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initTelemetry).call(this);
|
|
25
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initOptions).call(this);
|
|
26
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initTypes).call(this);
|
|
27
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initValidators).call(this);
|
|
28
|
+
__classPrivateFieldGet(this, _TeamsMeetingAttendancereportGetCommand_instances, "m", _TeamsMeetingAttendancereportGetCommand_initOptionSets).call(this);
|
|
29
|
+
}
|
|
30
|
+
async commandAction(logger, args) {
|
|
31
|
+
try {
|
|
32
|
+
const isAppOnlyAccessToken = accessToken.isAppOnlyAccessToken(auth.connection.accessTokens[auth.defaultResource].accessToken);
|
|
33
|
+
if (isAppOnlyAccessToken && !args.options.userId && !args.options.userName && !args.options.email) {
|
|
34
|
+
throw `The option 'userId', 'userName' or 'email' is required when retrieving meeting attendance report using app only permissions.`;
|
|
35
|
+
}
|
|
36
|
+
else if (!isAppOnlyAccessToken && (args.options.userId || args.options.userName || args.options.email)) {
|
|
37
|
+
throw `The options 'userId', 'userName' and 'email' cannot be used when retrieving meeting attendance report using delegated permissions.`;
|
|
38
|
+
}
|
|
39
|
+
if (this.verbose) {
|
|
40
|
+
await logger.logToStderr(`Retrieving attendance report for ${isAppOnlyAccessToken ? `specific user ${args.options.userId || args.options.userName || args.options.email}.` : 'currently logged in user'}.`);
|
|
41
|
+
}
|
|
42
|
+
let userUrl = '';
|
|
43
|
+
if (isAppOnlyAccessToken) {
|
|
44
|
+
const userId = await this.getUserId(args.options);
|
|
45
|
+
userUrl += `users/${userId}`;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
userUrl += 'me';
|
|
49
|
+
}
|
|
50
|
+
const requestOptions = {
|
|
51
|
+
url: `${this.resource}/v1.0/${userUrl}/onlineMeetings/${args.options.meetingId}/attendanceReports/${args.options.id}?$expand=attendanceRecords`,
|
|
52
|
+
headers: {
|
|
53
|
+
accept: 'application/json;odata.metadata=none'
|
|
54
|
+
},
|
|
55
|
+
responseType: 'json'
|
|
56
|
+
};
|
|
57
|
+
const attendanceReport = await request.get(requestOptions);
|
|
58
|
+
await logger.log(attendanceReport);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
this.handleRejectedODataJsonPromise(err);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async getUserId(options) {
|
|
65
|
+
if (options.userId) {
|
|
66
|
+
return options.userId;
|
|
67
|
+
}
|
|
68
|
+
if (options.userName) {
|
|
69
|
+
return entraUser.getUserIdByUpn(options.userName);
|
|
70
|
+
}
|
|
71
|
+
return entraUser.getUserIdByEmail(options.email);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
_TeamsMeetingAttendancereportGetCommand_instances = new WeakSet(), _TeamsMeetingAttendancereportGetCommand_initTelemetry = function _TeamsMeetingAttendancereportGetCommand_initTelemetry() {
|
|
75
|
+
this.telemetry.push((args) => {
|
|
76
|
+
Object.assign(this.telemetryProperties, {
|
|
77
|
+
userId: typeof args.options.userId !== 'undefined',
|
|
78
|
+
userName: typeof args.options.userName !== 'undefined',
|
|
79
|
+
email: typeof args.options.email !== 'undefined'
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}, _TeamsMeetingAttendancereportGetCommand_initOptions = function _TeamsMeetingAttendancereportGetCommand_initOptions() {
|
|
83
|
+
this.options.unshift({
|
|
84
|
+
option: '-u, --userId [userId]'
|
|
85
|
+
}, {
|
|
86
|
+
option: '-n, --userName [userName]'
|
|
87
|
+
}, {
|
|
88
|
+
option: '--email [email]'
|
|
89
|
+
}, {
|
|
90
|
+
option: '-m, --meetingId <meetingId>'
|
|
91
|
+
}, {
|
|
92
|
+
option: '-i, --id <id>'
|
|
93
|
+
});
|
|
94
|
+
}, _TeamsMeetingAttendancereportGetCommand_initTypes = function _TeamsMeetingAttendancereportGetCommand_initTypes() {
|
|
95
|
+
this.types.string.push('userId', 'userName', 'email', 'meetingId', 'id');
|
|
96
|
+
}, _TeamsMeetingAttendancereportGetCommand_initValidators = function _TeamsMeetingAttendancereportGetCommand_initValidators() {
|
|
97
|
+
this.validators.push(async (args) => {
|
|
98
|
+
if (!validation.isValidGuid(args.options.id)) {
|
|
99
|
+
return `${args.options.id} is not a valid GUID for option 'id'.`;
|
|
100
|
+
}
|
|
101
|
+
if (args.options.userId && !validation.isValidGuid(args.options.userId)) {
|
|
102
|
+
return `${args.options.userId} is not a valid GUID for option 'userId'.`;
|
|
103
|
+
}
|
|
104
|
+
if (args.options.userName && !validation.isValidUserPrincipalName(args.options.userName)) {
|
|
105
|
+
return `${args.options.userName} is not a valid UPN.`;
|
|
106
|
+
}
|
|
107
|
+
if (args.options.email && !validation.isValidUserPrincipalName(args.options.email)) {
|
|
108
|
+
return `${args.options.email} is not a valid email.`;
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
});
|
|
112
|
+
}, _TeamsMeetingAttendancereportGetCommand_initOptionSets = function _TeamsMeetingAttendancereportGetCommand_initOptionSets() {
|
|
113
|
+
this.optionSets.push({
|
|
114
|
+
options: ['userId', 'userName', 'email'],
|
|
115
|
+
runsWhen: (args) => args.options.userId || args.options.userName || args.options.email
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
export default new TeamsMeetingAttendancereportGetCommand();
|
|
119
|
+
//# sourceMappingURL=meeting-attendancereport-get.js.map
|
|
@@ -0,0 +1,112 @@
|
|
|
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 _TeamsMessageRemoveCommand_instances, _TeamsMessageRemoveCommand_initTelemetry, _TeamsMessageRemoveCommand_initOptions, _TeamsMessageRemoveCommand_initValidators, _TeamsMessageRemoveCommand_initOptionSets, _TeamsMessageRemoveCommand_initTypes;
|
|
7
|
+
import { cli } from '../../../../cli/cli.js';
|
|
8
|
+
import request from '../../../../request.js';
|
|
9
|
+
import { formatting } from '../../../../utils/formatting.js';
|
|
10
|
+
import { teams } from '../../../../utils/teams.js';
|
|
11
|
+
import { validation } from '../../../../utils/validation.js';
|
|
12
|
+
import DelegatedGraphCommand from '../../../base/DelegatedGraphCommand.js';
|
|
13
|
+
import commands from '../../commands.js';
|
|
14
|
+
class TeamsMessageRemoveCommand extends DelegatedGraphCommand {
|
|
15
|
+
get name() {
|
|
16
|
+
return commands.MESSAGE_REMOVE;
|
|
17
|
+
}
|
|
18
|
+
get description() {
|
|
19
|
+
return 'Removes a message from a channel in a Microsoft Teams team';
|
|
20
|
+
}
|
|
21
|
+
constructor() {
|
|
22
|
+
super();
|
|
23
|
+
_TeamsMessageRemoveCommand_instances.add(this);
|
|
24
|
+
__classPrivateFieldGet(this, _TeamsMessageRemoveCommand_instances, "m", _TeamsMessageRemoveCommand_initTelemetry).call(this);
|
|
25
|
+
__classPrivateFieldGet(this, _TeamsMessageRemoveCommand_instances, "m", _TeamsMessageRemoveCommand_initOptions).call(this);
|
|
26
|
+
__classPrivateFieldGet(this, _TeamsMessageRemoveCommand_instances, "m", _TeamsMessageRemoveCommand_initValidators).call(this);
|
|
27
|
+
__classPrivateFieldGet(this, _TeamsMessageRemoveCommand_instances, "m", _TeamsMessageRemoveCommand_initOptionSets).call(this);
|
|
28
|
+
__classPrivateFieldGet(this, _TeamsMessageRemoveCommand_instances, "m", _TeamsMessageRemoveCommand_initTypes).call(this);
|
|
29
|
+
}
|
|
30
|
+
async commandAction(logger, args) {
|
|
31
|
+
const removeTeamMessage = async () => {
|
|
32
|
+
try {
|
|
33
|
+
if (this.verbose) {
|
|
34
|
+
await logger.logToStderr(`Removing message '${args.options.id}' from channel '${args.options.channelId || args.options.channelName}' in team '${args.options.teamId || args.options.teamName}'.`);
|
|
35
|
+
}
|
|
36
|
+
const teamId = args.options.teamId || await teams.getTeamIdByDisplayName(args.options.teamName);
|
|
37
|
+
const channelId = args.options.channelId || await teams.getChannelIdByDisplayName(teamId, args.options.channelName);
|
|
38
|
+
const requestOptions = {
|
|
39
|
+
url: `${this.resource}/v1.0/teams/${teamId}/channels/${formatting.encodeQueryParameter(channelId)}/messages/${args.options.id}/softDelete`,
|
|
40
|
+
headers: {
|
|
41
|
+
accept: 'application/json;odata.metadata=none'
|
|
42
|
+
},
|
|
43
|
+
responseType: 'json'
|
|
44
|
+
};
|
|
45
|
+
await request.post(requestOptions);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
if (err.error?.error?.code === 'NotFound') {
|
|
49
|
+
this.handleError('The message was not found in the Teams channel.');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.handleRejectedODataJsonPromise(err);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
if (args.options.force) {
|
|
57
|
+
await removeTeamMessage();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const result = await cli.promptForConfirmation({ message: `Are you sure you want to remove this message?` });
|
|
61
|
+
if (result) {
|
|
62
|
+
await removeTeamMessage();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
_TeamsMessageRemoveCommand_instances = new WeakSet(), _TeamsMessageRemoveCommand_initTelemetry = function _TeamsMessageRemoveCommand_initTelemetry() {
|
|
68
|
+
this.telemetry.push((args) => {
|
|
69
|
+
Object.assign(this.telemetryProperties, {
|
|
70
|
+
teamId: typeof args.options.teamId !== 'undefined',
|
|
71
|
+
teamName: typeof args.options.teamName !== 'undefined',
|
|
72
|
+
channelId: typeof args.options.channelId !== 'undefined',
|
|
73
|
+
channelName: typeof args.options.channelName !== 'undefined',
|
|
74
|
+
force: !!args.options.force
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}, _TeamsMessageRemoveCommand_initOptions = function _TeamsMessageRemoveCommand_initOptions() {
|
|
78
|
+
this.options.unshift({
|
|
79
|
+
option: '--teamId [teamId]'
|
|
80
|
+
}, {
|
|
81
|
+
option: '--teamName [teamName]'
|
|
82
|
+
}, {
|
|
83
|
+
option: '--channelId [channelId]'
|
|
84
|
+
}, {
|
|
85
|
+
option: '--channelName [channelName]'
|
|
86
|
+
}, {
|
|
87
|
+
option: '-i, --id <id>'
|
|
88
|
+
}, {
|
|
89
|
+
option: '-f, --force'
|
|
90
|
+
});
|
|
91
|
+
}, _TeamsMessageRemoveCommand_initValidators = function _TeamsMessageRemoveCommand_initValidators() {
|
|
92
|
+
this.validators.push(async (args) => {
|
|
93
|
+
if (args.options.teamId && !validation.isValidGuid(args.options.teamId)) {
|
|
94
|
+
return `'${args.options.teamId}' is not a valid GUID for 'teamId'.`;
|
|
95
|
+
}
|
|
96
|
+
if (args.options.channelId && !validation.isValidTeamsChannelId(args.options.channelId)) {
|
|
97
|
+
return `'${args.options.channelId}' is not a valid ID for 'channelId'.`;
|
|
98
|
+
}
|
|
99
|
+
return true;
|
|
100
|
+
});
|
|
101
|
+
}, _TeamsMessageRemoveCommand_initOptionSets = function _TeamsMessageRemoveCommand_initOptionSets() {
|
|
102
|
+
this.optionSets.push({
|
|
103
|
+
options: ['teamId', 'teamName']
|
|
104
|
+
}, {
|
|
105
|
+
options: ['channelId', 'channelName']
|
|
106
|
+
});
|
|
107
|
+
}, _TeamsMessageRemoveCommand_initTypes = function _TeamsMessageRemoveCommand_initTypes() {
|
|
108
|
+
this.types.string.push('teamId', 'teamName', 'channelId', 'channelName', 'id');
|
|
109
|
+
this.types.boolean.push('force');
|
|
110
|
+
};
|
|
111
|
+
export default new TeamsMessageRemoveCommand();
|
|
112
|
+
//# sourceMappingURL=message-remove.js.map
|
|
@@ -30,12 +30,14 @@ export default {
|
|
|
30
30
|
MEETING_ADD: `${prefix} meeting add`,
|
|
31
31
|
MEETING_GET: `${prefix} meeting get`,
|
|
32
32
|
MEETING_LIST: `${prefix} meeting list`,
|
|
33
|
+
MEETING_ATTENDANCEREPORT_GET: `${prefix} meeting attendancereport get`,
|
|
33
34
|
MEETING_ATTENDANCEREPORT_LIST: `${prefix} meeting attendancereport list`,
|
|
34
35
|
MEETING_TRANSCRIPT_LIST: `${prefix} meeting transcript list`,
|
|
35
36
|
MEMBERSETTINGS_LIST: `${prefix} membersettings list`,
|
|
36
37
|
MEMBERSETTINGS_SET: `${prefix} membersettings set`,
|
|
37
38
|
MESSAGE_GET: `${prefix} message get`,
|
|
38
39
|
MESSAGE_LIST: `${prefix} message list`,
|
|
40
|
+
MESSAGE_REMOVE: `${prefix} message remove`,
|
|
39
41
|
MESSAGE_REPLY_LIST: `${prefix} message reply list`,
|
|
40
42
|
MESSAGE_SEND: `${prefix} message send`,
|
|
41
43
|
MESSAGINGSETTINGS_LIST: `${prefix} messagingsettings list`,
|
|
@@ -0,0 +1,166 @@
|
|
|
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 _VivaEngageCommunityAddCommand_instances, _VivaEngageCommunityAddCommand_initTelemetry, _VivaEngageCommunityAddCommand_initOptions, _VivaEngageCommunityAddCommand_initValidators, _VivaEngageCommunityAddCommand_initTypes, _VivaEngageCommunityAddCommand_initOptionSets;
|
|
7
|
+
import GraphCommand from '../../../base/GraphCommand.js';
|
|
8
|
+
import commands from '../../commands.js';
|
|
9
|
+
import request from '../../../../request.js';
|
|
10
|
+
import { validation } from '../../../../utils/validation.js';
|
|
11
|
+
import { accessToken } from '../../../../utils/accessToken.js';
|
|
12
|
+
import auth from '../../../../Auth.js';
|
|
13
|
+
import { formatting } from '../../../../utils/formatting.js';
|
|
14
|
+
import { entraUser } from '../../../../utils/entraUser.js';
|
|
15
|
+
import { setTimeout } from 'timers/promises';
|
|
16
|
+
class VivaEngageCommunityAddCommand extends GraphCommand {
|
|
17
|
+
get name() {
|
|
18
|
+
return commands.ENGAGE_COMMUNITY_ADD;
|
|
19
|
+
}
|
|
20
|
+
get description() {
|
|
21
|
+
return 'Creates a new community in Viva Engage';
|
|
22
|
+
}
|
|
23
|
+
constructor() {
|
|
24
|
+
super();
|
|
25
|
+
_VivaEngageCommunityAddCommand_instances.add(this);
|
|
26
|
+
this.pollingInterval = 5000;
|
|
27
|
+
this.privacyOptions = ['public', 'private'];
|
|
28
|
+
__classPrivateFieldGet(this, _VivaEngageCommunityAddCommand_instances, "m", _VivaEngageCommunityAddCommand_initTelemetry).call(this);
|
|
29
|
+
__classPrivateFieldGet(this, _VivaEngageCommunityAddCommand_instances, "m", _VivaEngageCommunityAddCommand_initOptions).call(this);
|
|
30
|
+
__classPrivateFieldGet(this, _VivaEngageCommunityAddCommand_instances, "m", _VivaEngageCommunityAddCommand_initValidators).call(this);
|
|
31
|
+
__classPrivateFieldGet(this, _VivaEngageCommunityAddCommand_instances, "m", _VivaEngageCommunityAddCommand_initTypes).call(this);
|
|
32
|
+
__classPrivateFieldGet(this, _VivaEngageCommunityAddCommand_instances, "m", _VivaEngageCommunityAddCommand_initOptionSets).call(this);
|
|
33
|
+
}
|
|
34
|
+
async commandAction(logger, args) {
|
|
35
|
+
const { displayName, description, privacy, adminEntraIds, adminEntraUserNames, wait } = args.options;
|
|
36
|
+
const isAppOnlyAccessToken = accessToken.isAppOnlyAccessToken(auth.connection.accessTokens[auth.defaultResource].accessToken);
|
|
37
|
+
if (isAppOnlyAccessToken && !adminEntraIds && !adminEntraUserNames) {
|
|
38
|
+
this.handleError(`Specify at least one admin using either adminEntraIds or adminEntraUserNames options when using application permissions.`);
|
|
39
|
+
}
|
|
40
|
+
if (this.verbose) {
|
|
41
|
+
await logger.logToStderr(`Creating a Viva Engage community with display name '${displayName}'...`);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const requestOptions = {
|
|
45
|
+
url: `${this.resource}/beta/employeeExperience/communities`,
|
|
46
|
+
headers: {
|
|
47
|
+
accept: 'application/json;odata.metadata=none',
|
|
48
|
+
'content-type': 'application/json'
|
|
49
|
+
},
|
|
50
|
+
responseType: 'json',
|
|
51
|
+
fullResponse: true,
|
|
52
|
+
data: {
|
|
53
|
+
displayName: displayName,
|
|
54
|
+
description: description,
|
|
55
|
+
privacy: privacy
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const entraIds = await this.getGraphUserUrls(args.options);
|
|
59
|
+
if (entraIds.length > 0) {
|
|
60
|
+
requestOptions.data['owners@odata.bind'] = entraIds;
|
|
61
|
+
}
|
|
62
|
+
const res = await request.post(requestOptions);
|
|
63
|
+
const location = res.headers.location;
|
|
64
|
+
if (!wait) {
|
|
65
|
+
await logger.log(location);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let status;
|
|
69
|
+
do {
|
|
70
|
+
if (this.verbose) {
|
|
71
|
+
await logger.logToStderr(`Community still provisioning. Retrying in ${this.pollingInterval / 1000} seconds...`);
|
|
72
|
+
}
|
|
73
|
+
await setTimeout(this.pollingInterval);
|
|
74
|
+
if (this.verbose) {
|
|
75
|
+
await logger.logToStderr(`Checking create community operation status...`);
|
|
76
|
+
}
|
|
77
|
+
const operation = await request.get({
|
|
78
|
+
url: location,
|
|
79
|
+
headers: {
|
|
80
|
+
accept: 'application/json;odata.metadata=none'
|
|
81
|
+
},
|
|
82
|
+
responseType: 'json'
|
|
83
|
+
});
|
|
84
|
+
status = operation.status;
|
|
85
|
+
if (this.verbose) {
|
|
86
|
+
await logger.logToStderr(`Community creation operation status: ${status}`);
|
|
87
|
+
}
|
|
88
|
+
if (status === 'failed') {
|
|
89
|
+
throw `Community creation failed: ${operation.statusDetail}`;
|
|
90
|
+
}
|
|
91
|
+
if (status === 'succeeded') {
|
|
92
|
+
await logger.log(operation);
|
|
93
|
+
}
|
|
94
|
+
} while (status === 'notStarted' || status === 'running');
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
this.handleRejectedODataJsonPromise(err);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async getGraphUserUrls(options) {
|
|
101
|
+
let entraIds = [];
|
|
102
|
+
if (options.adminEntraIds) {
|
|
103
|
+
entraIds = formatting.splitAndTrim(options.adminEntraIds);
|
|
104
|
+
}
|
|
105
|
+
else if (options.adminEntraUserNames) {
|
|
106
|
+
entraIds = await entraUser.getUserIdsByUpns(formatting.splitAndTrim(options.adminEntraUserNames));
|
|
107
|
+
}
|
|
108
|
+
const graphUserUrls = entraIds.map(id => `${this.resource}/beta/users/${id}`);
|
|
109
|
+
return graphUserUrls;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
_VivaEngageCommunityAddCommand_instances = new WeakSet(), _VivaEngageCommunityAddCommand_initTelemetry = function _VivaEngageCommunityAddCommand_initTelemetry() {
|
|
113
|
+
this.telemetry.push((args) => {
|
|
114
|
+
Object.assign(this.telemetryProperties, {
|
|
115
|
+
adminEntraIds: typeof args.options.adminEntraIds !== 'undefined',
|
|
116
|
+
adminEntraUserNames: typeof args.options.adminEntraUserNames !== 'undefined',
|
|
117
|
+
wait: !!args.options.wait
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}, _VivaEngageCommunityAddCommand_initOptions = function _VivaEngageCommunityAddCommand_initOptions() {
|
|
121
|
+
this.options.unshift({ option: '--displayName <displayName>' }, { option: '--description <description>' }, {
|
|
122
|
+
option: '--privacy <privacy>',
|
|
123
|
+
autocomplete: this.privacyOptions
|
|
124
|
+
}, { option: '--adminEntraIds [adminEntraIds]' }, { option: '--adminEntraUserNames [adminEntraUserNames]' }, { option: '--wait' });
|
|
125
|
+
}, _VivaEngageCommunityAddCommand_initValidators = function _VivaEngageCommunityAddCommand_initValidators() {
|
|
126
|
+
this.validators.push(async (args) => {
|
|
127
|
+
if (args.options.displayName.length > 255) {
|
|
128
|
+
return `The maximum amount of characters for 'displayName' is 255.`;
|
|
129
|
+
}
|
|
130
|
+
if (args.options.description.length > 1024) {
|
|
131
|
+
return `The maximum amount of characters for 'description' is 1024.`;
|
|
132
|
+
}
|
|
133
|
+
if (this.privacyOptions.indexOf(args.options.privacy) === -1) {
|
|
134
|
+
return `'${args.options.privacy}' is not a valid value for privacy. Allowed values are: ${this.privacyOptions.join(', ')}.`;
|
|
135
|
+
}
|
|
136
|
+
if (args.options.adminEntraIds) {
|
|
137
|
+
const isValidGUIDArrayResult = validation.isValidGuidArray(args.options.adminEntraIds);
|
|
138
|
+
if (isValidGUIDArrayResult !== true) {
|
|
139
|
+
return `The following GUIDs are invalid for the option 'adminEntraIds': ${isValidGUIDArrayResult}.`;
|
|
140
|
+
}
|
|
141
|
+
if (formatting.splitAndTrim(args.options.adminEntraIds).length > 20) {
|
|
142
|
+
return `Maximum of 20 admins allowed. Please reduce the number of users and try again.`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (args.options.adminEntraUserNames) {
|
|
146
|
+
const isValidUPNArrayResult = validation.isValidUserPrincipalNameArray(args.options.adminEntraUserNames);
|
|
147
|
+
if (isValidUPNArrayResult !== true) {
|
|
148
|
+
return `The following user principal names are invalid for the option 'adminEntraUserNames': ${isValidUPNArrayResult}.`;
|
|
149
|
+
}
|
|
150
|
+
if (formatting.splitAndTrim(args.options.adminEntraUserNames).length > 20) {
|
|
151
|
+
return `Maximum of 20 admins allowed. Please reduce the number of users and try again.`;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return true;
|
|
155
|
+
});
|
|
156
|
+
}, _VivaEngageCommunityAddCommand_initTypes = function _VivaEngageCommunityAddCommand_initTypes() {
|
|
157
|
+
this.types.string.push('displayName', 'description', 'privacy', 'adminEntraIds', 'adminEntraUserNames');
|
|
158
|
+
this.types.boolean.push('wait');
|
|
159
|
+
}, _VivaEngageCommunityAddCommand_initOptionSets = function _VivaEngageCommunityAddCommand_initOptionSets() {
|
|
160
|
+
this.optionSets.push({
|
|
161
|
+
options: ['adminEntraIds', 'adminEntraUserNames'],
|
|
162
|
+
runsWhen: (args) => args.options.adminEntraIds || args.options.adminEntraUserNames
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
export default new VivaEngageCommunityAddCommand();
|
|
166
|
+
//# sourceMappingURL=engage-community-add.js.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const prefix = 'viva';
|
|
2
2
|
export default {
|
|
3
3
|
CONNECTIONS_APP_CREATE: `${prefix} connections app create`,
|
|
4
|
+
ENGAGE_COMMUNITY_ADD: `${prefix} engage community add`,
|
|
4
5
|
ENGAGE_COMMUNITY_GET: `${prefix} engage community get`,
|
|
5
6
|
ENGAGE_GROUP_LIST: `${prefix} engage group list`,
|
|
6
7
|
ENGAGE_GROUP_USER_ADD: `${prefix} engage group user add`,
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import request from "../request.js";
|
|
2
|
+
export const drive = {
|
|
3
|
+
/**
|
|
4
|
+
* Retrieves the Drive associated with the specified site and URL.
|
|
5
|
+
* @param siteId Site ID
|
|
6
|
+
* @param url Drive URL
|
|
7
|
+
* @param logger The logger object
|
|
8
|
+
* @param verbose Set for verbose logging
|
|
9
|
+
* @returns The Drive associated with the drive URL.
|
|
10
|
+
*/
|
|
11
|
+
async getDriveByUrl(siteId, url, logger, verbose) {
|
|
12
|
+
if (verbose && logger) {
|
|
13
|
+
await logger.logToStderr(`Retrieving drive information for URL: ${url.href}`);
|
|
14
|
+
}
|
|
15
|
+
const requestOptions = {
|
|
16
|
+
url: `https://graph.microsoft.com/v1.0/sites/${siteId}/drives?$select=webUrl,id`,
|
|
17
|
+
headers: {
|
|
18
|
+
accept: 'application/json;odata.metadata=none'
|
|
19
|
+
},
|
|
20
|
+
responseType: 'json'
|
|
21
|
+
};
|
|
22
|
+
const drives = await request.get(requestOptions);
|
|
23
|
+
const lowerCaseFolderUrl = url.href.toLowerCase();
|
|
24
|
+
const drive = drives.value
|
|
25
|
+
.sort((a, b) => b.webUrl.localeCompare(a.webUrl))
|
|
26
|
+
.find((d) => {
|
|
27
|
+
const driveUrl = d.webUrl.toLowerCase();
|
|
28
|
+
return lowerCaseFolderUrl.startsWith(driveUrl) &&
|
|
29
|
+
(driveUrl.length === lowerCaseFolderUrl.length ||
|
|
30
|
+
lowerCaseFolderUrl[driveUrl.length] === '/');
|
|
31
|
+
});
|
|
32
|
+
if (!drive) {
|
|
33
|
+
throw new Error(`Drive '${url.href}' not found`);
|
|
34
|
+
}
|
|
35
|
+
return drive;
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* Retrieves the ID of a drive item (file, folder, etc.) associated with the given drive and item URL.
|
|
39
|
+
* @param drive The Drive object containing the item
|
|
40
|
+
* @param itemUrl Item URL
|
|
41
|
+
* @param logger The logger object
|
|
42
|
+
* @param verbose Set for verbose logging
|
|
43
|
+
* @returns Drive item ID
|
|
44
|
+
*/
|
|
45
|
+
async getDriveItemId(drive, itemUrl, logger, verbose) {
|
|
46
|
+
const relativeItemUrl = itemUrl.href.replace(new RegExp(`${drive.webUrl}`, 'i'), '').replace(/\/+$/, '');
|
|
47
|
+
if (verbose && logger) {
|
|
48
|
+
await logger.logToStderr(`Retrieving drive item ID for URL: ${relativeItemUrl}`);
|
|
49
|
+
}
|
|
50
|
+
const requestOptions = {
|
|
51
|
+
url: `https://graph.microsoft.com/v1.0/drives/${drive.id}/root${relativeItemUrl ? `:${relativeItemUrl}` : ''}?$select=id`,
|
|
52
|
+
headers: {
|
|
53
|
+
accept: 'application/json;odata.metadata=none'
|
|
54
|
+
},
|
|
55
|
+
responseType: 'json'
|
|
56
|
+
};
|
|
57
|
+
const driveItem = await request.get(requestOptions);
|
|
58
|
+
return driveItem?.id;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=drive.js.map
|
package/dist/utils/formatting.js
CHANGED
|
@@ -9,6 +9,8 @@ export var CheckStatus;
|
|
|
9
9
|
(function (CheckStatus) {
|
|
10
10
|
CheckStatus[CheckStatus["Success"] = 0] = "Success";
|
|
11
11
|
CheckStatus[CheckStatus["Failure"] = 1] = "Failure";
|
|
12
|
+
CheckStatus[CheckStatus["Information"] = 2] = "Information";
|
|
13
|
+
CheckStatus[CheckStatus["Warning"] = 3] = "Warning";
|
|
12
14
|
})(CheckStatus || (CheckStatus = {}));
|
|
13
15
|
export const formatting = {
|
|
14
16
|
escapeXml(s) {
|
|
@@ -37,6 +39,22 @@ export const formatting = {
|
|
|
37
39
|
parseJsonWithBom(s) {
|
|
38
40
|
return JSON.parse(s.replace(/^\uFEFF/, ''));
|
|
39
41
|
},
|
|
42
|
+
/**
|
|
43
|
+
* Tries to parse a string as JSON. If it fails, returns the original string.
|
|
44
|
+
* @param value JSON string to parse.
|
|
45
|
+
* @returns JSON object or the original string if parsing fails.
|
|
46
|
+
*/
|
|
47
|
+
tryParseJson(value) {
|
|
48
|
+
try {
|
|
49
|
+
if (typeof value !== 'string') {
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
return JSON.parse(value);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
40
58
|
filterObject(obj, propertiesToInclude) {
|
|
41
59
|
const objKeys = Object.keys(obj);
|
|
42
60
|
return propertiesToInclude
|
|
@@ -152,7 +170,18 @@ export const formatting = {
|
|
|
152
170
|
process.env.TERM === 'xterm-256color';
|
|
153
171
|
const success = primarySupported ? '✔' : '√';
|
|
154
172
|
const failure = primarySupported ? '✖' : '×';
|
|
155
|
-
|
|
173
|
+
const information = 'i';
|
|
174
|
+
const warning = '!';
|
|
175
|
+
switch (result) {
|
|
176
|
+
case CheckStatus.Success:
|
|
177
|
+
return `${chalk.green(success)} ${message}`;
|
|
178
|
+
case CheckStatus.Failure:
|
|
179
|
+
return `${chalk.red(failure)} ${message}`;
|
|
180
|
+
case CheckStatus.Information:
|
|
181
|
+
return `${chalk.blue(information)} ${message}`;
|
|
182
|
+
case CheckStatus.Warning:
|
|
183
|
+
return `${chalk.yellow(warning)} ${message}`;
|
|
184
|
+
}
|
|
156
185
|
},
|
|
157
186
|
convertArrayToHashTable(key, array) {
|
|
158
187
|
const resultAsKeyValuePair = {};
|
package/dist/utils/spo.js
CHANGED
|
@@ -454,15 +454,46 @@ export const spo = {
|
|
|
454
454
|
const res = await request.get(requestOptions);
|
|
455
455
|
return res.AadObjectId.NameId;
|
|
456
456
|
},
|
|
457
|
+
/**
|
|
458
|
+
* Ensure a user exists on a specific SharePoint site.
|
|
459
|
+
* @param webUrl URL of the SharePoint site.
|
|
460
|
+
* @param logonName Logon name of the user to ensure on the SharePoint site.
|
|
461
|
+
* @returns SharePoint user object.
|
|
462
|
+
*/
|
|
463
|
+
async ensureUser(webUrl, logonName) {
|
|
464
|
+
const requestOptions = {
|
|
465
|
+
url: `${webUrl}/_api/web/EnsureUser`,
|
|
466
|
+
headers: {
|
|
467
|
+
accept: 'application/json;odata=nometadata'
|
|
468
|
+
},
|
|
469
|
+
responseType: 'json',
|
|
470
|
+
data: {
|
|
471
|
+
logonName: logonName
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
return request.post(requestOptions);
|
|
475
|
+
},
|
|
476
|
+
/**
|
|
477
|
+
* Ensure a Microsoft Entra ID group exists on a specific SharePoint site.
|
|
478
|
+
* @param webUrl URL of the SharePoint site.
|
|
479
|
+
* @param group Microsoft Entra ID group.
|
|
480
|
+
* @returns SharePoint user object.
|
|
481
|
+
*/
|
|
482
|
+
async ensureEntraGroup(webUrl, group) {
|
|
483
|
+
if (!group.securityEnabled) {
|
|
484
|
+
throw new Error('Cannot ensure a Microsoft Entra ID group that is not security enabled.');
|
|
485
|
+
}
|
|
486
|
+
return this.ensureUser(webUrl, group.mailEnabled ? `c:0o.c|federateddirectoryclaimprovider|${group.id}` : `c:0t.c|tenant|${group.id}`);
|
|
487
|
+
},
|
|
457
488
|
/**
|
|
458
489
|
* Retrieves the spo user by email.
|
|
459
490
|
* @param webUrl Web url
|
|
460
491
|
* @param email The email of the user
|
|
461
492
|
* @param logger the Logger object
|
|
462
|
-
* @param
|
|
493
|
+
* @param verbose set if verbose logging should be logged
|
|
463
494
|
*/
|
|
464
|
-
async getUserByEmail(webUrl, email, logger,
|
|
465
|
-
if (
|
|
495
|
+
async getUserByEmail(webUrl, email, logger, verbose) {
|
|
496
|
+
if (verbose) {
|
|
466
497
|
await logger.logToStderr(`Retrieving the spo user by email ${email}`);
|
|
467
498
|
}
|
|
468
499
|
const requestUrl = `${webUrl}/_api/web/siteusers/GetByEmail('${formatting.encodeQueryParameter(email)}')`;
|
|
@@ -533,10 +564,10 @@ export const spo = {
|
|
|
533
564
|
* @param webUrl Web url
|
|
534
565
|
* @param name The name of the group
|
|
535
566
|
* @param logger the Logger object
|
|
536
|
-
* @param
|
|
567
|
+
* @param verbose set if verbose logging should be logged
|
|
537
568
|
*/
|
|
538
|
-
async getGroupByName(webUrl, name, logger,
|
|
539
|
-
if (
|
|
569
|
+
async getGroupByName(webUrl, name, logger, verbose) {
|
|
570
|
+
if (verbose) {
|
|
540
571
|
await logger.logToStderr(`Retrieving the group by name ${name}`);
|
|
541
572
|
}
|
|
542
573
|
const requestUrl = `${webUrl}/_api/web/sitegroups/GetByName('${formatting.encodeQueryParameter(name)}')`;
|
|
@@ -1374,6 +1405,38 @@ export const spo = {
|
|
|
1374
1405
|
const site = await request.get(requestOptions);
|
|
1375
1406
|
return site.id;
|
|
1376
1407
|
},
|
|
1408
|
+
/**
|
|
1409
|
+
* Retrieves the server-relative URL of a folder.
|
|
1410
|
+
* @param webUrl Web URL
|
|
1411
|
+
* @param folderUrl Folder URL
|
|
1412
|
+
* @param folderId Folder ID
|
|
1413
|
+
* @param logger The logger object
|
|
1414
|
+
* @param verbose Set for verbose logging
|
|
1415
|
+
* @returns The server-relative URL of the folder
|
|
1416
|
+
*/
|
|
1417
|
+
async getFolderServerRelativeUrl(webUrl, folderUrl, folderId, logger, verbose) {
|
|
1418
|
+
if (verbose && logger) {
|
|
1419
|
+
await logger.logToStderr(`Retrieving server-relative URL for folder ${folderUrl ? `URL: ${folderUrl}` : `ID: ${folderId}`}`);
|
|
1420
|
+
}
|
|
1421
|
+
let requestUrl = `${webUrl}/_api/web/`;
|
|
1422
|
+
if (folderUrl) {
|
|
1423
|
+
const folderServerRelativeUrl = urlUtil.getServerRelativePath(webUrl, folderUrl);
|
|
1424
|
+
requestUrl += `GetFolderByServerRelativePath(decodedUrl='${formatting.encodeQueryParameter(folderServerRelativeUrl)}')`;
|
|
1425
|
+
}
|
|
1426
|
+
else {
|
|
1427
|
+
requestUrl += `GetFolderById('${folderId}')`;
|
|
1428
|
+
}
|
|
1429
|
+
requestUrl += '?$select=ServerRelativeUrl';
|
|
1430
|
+
const requestOptions = {
|
|
1431
|
+
url: requestUrl,
|
|
1432
|
+
headers: {
|
|
1433
|
+
accept: 'application/json;odata=nometadata'
|
|
1434
|
+
},
|
|
1435
|
+
responseType: 'json'
|
|
1436
|
+
};
|
|
1437
|
+
const res = await request.get(requestOptions);
|
|
1438
|
+
return res.ServerRelativeUrl;
|
|
1439
|
+
},
|
|
1377
1440
|
/**
|
|
1378
1441
|
* Retrieves the ObjectIdentity from a SharePoint site
|
|
1379
1442
|
* @param webUrl web url
|