@pnp/cli-microsoft365 10.0.0-beta.04ac437 → 10.0.0-beta.58166a8
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 +3 -3
- package/dist/AuthServer.js +7 -7
- 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/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/flow/commands/environment/environment-list.js +1 -1
- 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/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/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/site-admin-list.js +8 -9
- package/dist/m365/spo/commands/site/site-admin-remove.js +5 -4
- package/dist/m365/spo/commands/site/site-sharingpermission-set.js +68 -0
- 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/web/web-clientsidewebpart-list.js +1 -6
- package/dist/m365/spo/commands.js +2 -1
- package/dist/m365/teams/commands/tab/tab-list.js +5 -3
- 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/spo.js +5 -7
- package/dist/utils/timersUtil.js +12 -0
- package/dist/utils/urlUtil.js +8 -0
- package/docs/docs/cmd/cli/cli-doctor.mdx +24 -23
- 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/spo/page/page-remove.mdx +30 -12
- package/docs/docs/cmd/spo/site/site-admin-list.mdx +64 -12
- package/docs/docs/cmd/spo/site/site-sharingpermission-set.mdx +58 -0
- package/docs/docs/cmd/spo/{site/site-rename.mdx → tenant/tenant-site-rename.mdx} +7 -7
- package/docs/docs/cmd/teams/tab/tab-list.mdx +1 -2
- package/docs/docs/cmd/viva/engage/engage-community-list.mdx +81 -0
- package/package.json +1 -1
- package/dist/m365/cli/commands/cli-reconsent.js +0 -29
- package/docs/docs/cmd/cli/cli-reconsent.mdx +0 -62
|
@@ -30,9 +30,7 @@ class SpoPageTemplateListCommand extends SpoCommand {
|
|
|
30
30
|
}
|
|
31
31
|
try {
|
|
32
32
|
const res = await odata.getAllItems(`${args.options.webUrl}/_api/sitepages/pages/templates`);
|
|
33
|
-
|
|
34
|
-
await logger.log(res);
|
|
35
|
-
}
|
|
33
|
+
await logger.log(res);
|
|
36
34
|
}
|
|
37
35
|
catch (err) {
|
|
38
36
|
// The API returns a 404 when no templates are created on the site collection
|
|
@@ -17,6 +17,9 @@ class SpoSiteAdminListCommand extends SpoCommand {
|
|
|
17
17
|
get description() {
|
|
18
18
|
return 'Lists all administrators of a specific SharePoint site';
|
|
19
19
|
}
|
|
20
|
+
defaultProperties() {
|
|
21
|
+
return ['Id', 'LoginName', 'Title', 'PrincipalTypeString'];
|
|
22
|
+
}
|
|
20
23
|
constructor() {
|
|
21
24
|
super();
|
|
22
25
|
_SpoSiteAdminListCommand_instances.add(this);
|
|
@@ -46,20 +49,16 @@ class SpoSiteAdminListCommand extends SpoCommand {
|
|
|
46
49
|
const requestOptions = {
|
|
47
50
|
url: `${adminUrl}/_api/SPO.Tenant/GetSiteAdministrators?siteId='${siteId}'`,
|
|
48
51
|
headers: {
|
|
49
|
-
accept: 'application/json;odata=nometadata'
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
accept: 'application/json;odata=nometadata'
|
|
53
|
+
},
|
|
54
|
+
responseType: 'json'
|
|
52
55
|
};
|
|
53
56
|
const response = await request.post(requestOptions);
|
|
54
|
-
const responseContent = JSON.parse(response);
|
|
55
57
|
const primaryAdminLoginName = await spo.getPrimaryAdminLoginNameAsAdmin(adminUrl, siteId, logger, this.verbose);
|
|
56
|
-
const mappedResult =
|
|
57
|
-
Id: null,
|
|
58
|
+
const mappedResult = response.value.map((u) => ({
|
|
58
59
|
Email: u.email,
|
|
59
60
|
LoginName: u.loginName,
|
|
60
61
|
Title: u.name,
|
|
61
|
-
PrincipalType: null,
|
|
62
|
-
PrincipalTypeString: null,
|
|
63
62
|
IsPrimaryAdmin: u.loginName === primaryAdminLoginName
|
|
64
63
|
}));
|
|
65
64
|
await logger.log(mappedResult);
|
|
@@ -78,7 +77,6 @@ class SpoSiteAdminListCommand extends SpoCommand {
|
|
|
78
77
|
}
|
|
79
78
|
const requestOptions = {
|
|
80
79
|
url: `${args.options.siteUrl}/_api/web/siteusers?$filter=IsSiteAdmin eq true`,
|
|
81
|
-
method: 'GET',
|
|
82
80
|
headers: {
|
|
83
81
|
'accept': 'application/json;odata=nometadata'
|
|
84
82
|
},
|
|
@@ -114,6 +112,7 @@ _SpoSiteAdminListCommand_instances = new WeakSet(), _SpoSiteAdminListCommand_ini
|
|
|
114
112
|
this.validators.push(async (args) => validation.isValidSharePointUrl(args.options.siteUrl));
|
|
115
113
|
}, _SpoSiteAdminListCommand_initTypes = function _SpoSiteAdminListCommand_initTypes() {
|
|
116
114
|
this.types.string.push('siteUrl');
|
|
115
|
+
this.types.boolean.push('asAdmin');
|
|
117
116
|
};
|
|
118
117
|
export default new SpoSiteAdminListCommand();
|
|
119
118
|
//# sourceMappingURL=site-admin-list.js.map
|
|
@@ -77,11 +77,11 @@ class SpoSiteAdminRemoveCommand extends SpoCommand {
|
|
|
77
77
|
headers: {
|
|
78
78
|
accept: 'application/json;odata=nometadata',
|
|
79
79
|
'content-type': 'application/json;charset=utf-8'
|
|
80
|
-
}
|
|
80
|
+
},
|
|
81
|
+
responseType: 'json'
|
|
81
82
|
};
|
|
82
83
|
const response = await request.post(requestOptions);
|
|
83
|
-
|
|
84
|
-
return responseContent.value;
|
|
84
|
+
return response.value;
|
|
85
85
|
}
|
|
86
86
|
async getCorrectLoginName(options) {
|
|
87
87
|
if (options.userId || options.userName) {
|
|
@@ -116,7 +116,8 @@ class SpoSiteAdminRemoveCommand extends SpoCommand {
|
|
|
116
116
|
siteId: siteId,
|
|
117
117
|
secondaryAdministratorLoginNames: admins.map(u => u.loginName)
|
|
118
118
|
}
|
|
119
|
-
}
|
|
119
|
+
},
|
|
120
|
+
responseType: 'json'
|
|
120
121
|
};
|
|
121
122
|
await request.post(requestOptions);
|
|
122
123
|
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import SpoCommand from '../../../base/SpoCommand.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 request from '../../../../request.js';
|
|
8
|
+
const options = globalOptionsZod
|
|
9
|
+
.extend({
|
|
10
|
+
siteUrl: zod.alias('u', z.string()
|
|
11
|
+
.refine(url => validation.isValidSharePointUrl(url) === true, url => ({
|
|
12
|
+
message: `'${url}' is not a valid SharePoint Online site URL.`
|
|
13
|
+
}))),
|
|
14
|
+
capability: z.enum(['full', 'limited', 'ownersOnly'])
|
|
15
|
+
})
|
|
16
|
+
.strict();
|
|
17
|
+
class SpoSiteSharingPermissionSetCommand extends SpoCommand {
|
|
18
|
+
get name() {
|
|
19
|
+
return commands.SITE_SHARINGPERMISSION_SET;
|
|
20
|
+
}
|
|
21
|
+
get description() {
|
|
22
|
+
return 'Controls how a site and its components can be shared';
|
|
23
|
+
}
|
|
24
|
+
get schema() {
|
|
25
|
+
return options;
|
|
26
|
+
}
|
|
27
|
+
async commandAction(logger, args) {
|
|
28
|
+
try {
|
|
29
|
+
if (this.verbose) {
|
|
30
|
+
await logger.logToStderr(`Updating sharing permissions for site '${args.options.siteUrl}'...`);
|
|
31
|
+
}
|
|
32
|
+
const { capability } = args.options;
|
|
33
|
+
if (this.verbose) {
|
|
34
|
+
await logger.logToStderr(`Updating site sharing permissions...`);
|
|
35
|
+
}
|
|
36
|
+
const requestOptionsWeb = {
|
|
37
|
+
url: `${args.options.siteUrl}/_api/Web`,
|
|
38
|
+
headers: {
|
|
39
|
+
accept: 'application/json;odata=nometadata'
|
|
40
|
+
},
|
|
41
|
+
responseType: 'json',
|
|
42
|
+
data: {
|
|
43
|
+
MembersCanShare: capability === 'full' || capability === 'limited'
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
await request.patch(requestOptionsWeb);
|
|
47
|
+
if (this.verbose) {
|
|
48
|
+
await logger.logToStderr(`Updating associated member group sharing permissions...`);
|
|
49
|
+
}
|
|
50
|
+
const requestOptionsMemberGroup = {
|
|
51
|
+
url: `${args.options.siteUrl}/_api/Web/AssociatedMemberGroup`,
|
|
52
|
+
headers: {
|
|
53
|
+
accept: 'application/json;odata=nometadata'
|
|
54
|
+
},
|
|
55
|
+
responseType: 'json',
|
|
56
|
+
data: {
|
|
57
|
+
AllowMembersEditMembership: capability === 'full'
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
await request.patch(requestOptionsMemberGroup);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
this.handleRejectedODataJsonPromise(err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export default new SpoSiteSharingPermissionSetCommand();
|
|
68
|
+
//# sourceMappingURL=site-sharingpermission-set.js.map
|
|
@@ -22,9 +22,7 @@ class SpoSiteScriptListCommand extends SpoCommand {
|
|
|
22
22
|
responseType: 'json'
|
|
23
23
|
};
|
|
24
24
|
const res = await request.post(requestOptions);
|
|
25
|
-
|
|
26
|
-
await logger.log(res.value);
|
|
27
|
-
}
|
|
25
|
+
await logger.log(res.value);
|
|
28
26
|
}
|
|
29
27
|
catch (err) {
|
|
30
28
|
this.handleRejectedODataJsonPromise(err);
|
|
@@ -3,25 +3,26 @@ 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
|
|
6
|
+
var _SpoTenantSiteRenameCommand_instances, _SpoTenantSiteRenameCommand_initTelemetry, _SpoTenantSiteRenameCommand_initOptions, _SpoTenantSiteRenameCommand_initValidators;
|
|
7
7
|
import request from '../../../../request.js';
|
|
8
8
|
import { formatting } from '../../../../utils/formatting.js';
|
|
9
9
|
import { spo } from '../../../../utils/spo.js';
|
|
10
|
+
import { timersUtil } from '../../../../utils/timersUtil.js';
|
|
10
11
|
import SpoCommand from '../../../base/SpoCommand.js';
|
|
11
12
|
import commands from '../../commands.js';
|
|
12
|
-
class
|
|
13
|
+
class SpoTenantSiteRenameCommand extends SpoCommand {
|
|
13
14
|
get name() {
|
|
14
|
-
return commands.
|
|
15
|
+
return commands.TENANT_SITE_RENAME;
|
|
15
16
|
}
|
|
16
17
|
get description() {
|
|
17
18
|
return 'Renames the URL and title of a site collection';
|
|
18
19
|
}
|
|
19
20
|
constructor() {
|
|
20
21
|
super();
|
|
21
|
-
|
|
22
|
-
__classPrivateFieldGet(this,
|
|
23
|
-
__classPrivateFieldGet(this,
|
|
24
|
-
__classPrivateFieldGet(this,
|
|
22
|
+
_SpoTenantSiteRenameCommand_instances.add(this);
|
|
23
|
+
__classPrivateFieldGet(this, _SpoTenantSiteRenameCommand_instances, "m", _SpoTenantSiteRenameCommand_initTelemetry).call(this);
|
|
24
|
+
__classPrivateFieldGet(this, _SpoTenantSiteRenameCommand_instances, "m", _SpoTenantSiteRenameCommand_initOptions).call(this);
|
|
25
|
+
__classPrivateFieldGet(this, _SpoTenantSiteRenameCommand_instances, "m", _SpoTenantSiteRenameCommand_initValidators).call(this);
|
|
25
26
|
}
|
|
26
27
|
async commandAction(logger, args) {
|
|
27
28
|
try {
|
|
@@ -40,24 +41,23 @@ class SpoSiteRenameCommand extends SpoCommand {
|
|
|
40
41
|
optionsBitmask = optionsBitmask | 16;
|
|
41
42
|
}
|
|
42
43
|
const requestOptions = {
|
|
43
|
-
"SourceSiteUrl": options.url,
|
|
44
|
-
"TargetSiteUrl": options.newUrl,
|
|
45
|
-
"TargetSiteTitle": options.newTitle || null,
|
|
46
|
-
"Option": optionsBitmask,
|
|
47
|
-
"Reserve": null,
|
|
48
|
-
"SkipGestures": null,
|
|
49
|
-
"OperationId": "00000000-0000-0000-0000-000000000000"
|
|
50
|
-
};
|
|
51
|
-
const postData = {
|
|
52
44
|
url: `${spoAdminUrl}/_api/SiteRenameJobs?api-version=1.4.7`,
|
|
53
45
|
headers: {
|
|
54
46
|
'X-RequestDigest': this.context.FormDigestValue,
|
|
55
47
|
'Content-Type': 'application/json'
|
|
56
48
|
},
|
|
57
49
|
responseType: 'json',
|
|
58
|
-
data:
|
|
50
|
+
data: {
|
|
51
|
+
SourceSiteUrl: options.url,
|
|
52
|
+
TargetSiteUrl: options.newUrl,
|
|
53
|
+
TargetSiteTitle: options.newTitle || null,
|
|
54
|
+
Option: optionsBitmask,
|
|
55
|
+
Reserve: null,
|
|
56
|
+
SkipGestures: null,
|
|
57
|
+
OperationId: '00000000-0000-0000-0000-000000000000'
|
|
58
|
+
}
|
|
59
59
|
};
|
|
60
|
-
const res = await request.post(
|
|
60
|
+
const res = await request.post(requestOptions);
|
|
61
61
|
if (options.verbose) {
|
|
62
62
|
await logger.logToStderr(res);
|
|
63
63
|
}
|
|
@@ -92,23 +92,20 @@ class SpoSiteRenameCommand extends SpoCommand {
|
|
|
92
92
|
if (this.operationData.JobState === "Success") {
|
|
93
93
|
return;
|
|
94
94
|
}
|
|
95
|
-
await
|
|
95
|
+
await timersUtil.setTimeout(SpoTenantSiteRenameCommand.checkIntervalInMs);
|
|
96
96
|
await command.waitForRenameCompletion(command, isVerbose, spoAdminUrl, siteUrl, iteration);
|
|
97
97
|
}
|
|
98
|
-
sleep(ms) {
|
|
99
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
100
|
-
}
|
|
101
98
|
}
|
|
102
|
-
|
|
99
|
+
_SpoTenantSiteRenameCommand_instances = new WeakSet(), _SpoTenantSiteRenameCommand_initTelemetry = function _SpoTenantSiteRenameCommand_initTelemetry() {
|
|
103
100
|
this.telemetry.push((args) => {
|
|
104
101
|
Object.assign(this.telemetryProperties, {
|
|
105
|
-
newTitle: args.options.newTitle
|
|
106
|
-
suppressMarketplaceAppCheck: args.options.suppressMarketplaceAppCheck,
|
|
107
|
-
suppressWorkflow2013Check: args.options.suppressWorkflow2013Check,
|
|
108
|
-
wait: args.options.wait
|
|
102
|
+
newTitle: typeof args.options.newTitle !== 'undefined',
|
|
103
|
+
suppressMarketplaceAppCheck: !!args.options.suppressMarketplaceAppCheck,
|
|
104
|
+
suppressWorkflow2013Check: !!args.options.suppressWorkflow2013Check,
|
|
105
|
+
wait: !!args.options.wait
|
|
109
106
|
});
|
|
110
107
|
});
|
|
111
|
-
},
|
|
108
|
+
}, _SpoTenantSiteRenameCommand_initOptions = function _SpoTenantSiteRenameCommand_initOptions() {
|
|
112
109
|
this.options.unshift({
|
|
113
110
|
option: '-u, --url <url>'
|
|
114
111
|
}, {
|
|
@@ -122,7 +119,7 @@ _SpoSiteRenameCommand_instances = new WeakSet(), _SpoSiteRenameCommand_initTelem
|
|
|
122
119
|
}, {
|
|
123
120
|
option: '--wait'
|
|
124
121
|
});
|
|
125
|
-
},
|
|
122
|
+
}, _SpoTenantSiteRenameCommand_initValidators = function _SpoTenantSiteRenameCommand_initValidators() {
|
|
126
123
|
this.validators.push(async (args) => {
|
|
127
124
|
if (args.options.url.toLowerCase() === args.options.newUrl.toLowerCase()) {
|
|
128
125
|
return 'The new URL cannot be the same as the target URL.';
|
|
@@ -130,6 +127,6 @@ _SpoSiteRenameCommand_instances = new WeakSet(), _SpoSiteRenameCommand_initTelem
|
|
|
130
127
|
return true;
|
|
131
128
|
});
|
|
132
129
|
};
|
|
133
|
-
|
|
134
|
-
export default new
|
|
135
|
-
//# sourceMappingURL=site-rename.js.map
|
|
130
|
+
SpoTenantSiteRenameCommand.checkIntervalInMs = 5000;
|
|
131
|
+
export default new SpoTenantSiteRenameCommand();
|
|
132
|
+
//# sourceMappingURL=tenant-site-rename.js.map
|
|
@@ -26,7 +26,7 @@ class SpoThemeListCommand extends SpoCommand {
|
|
|
26
26
|
responseType: 'json'
|
|
27
27
|
};
|
|
28
28
|
const rawRes = await request.post(requestOptions);
|
|
29
|
-
await logger.log(rawRes.themePreviews);
|
|
29
|
+
await logger.log(rawRes.themePreviews || []);
|
|
30
30
|
}
|
|
31
31
|
catch (err) {
|
|
32
32
|
this.handleRejectedODataJsonPromise(err);
|
|
@@ -41,12 +41,7 @@ class SpoWebClientSideWebPartListCommand extends SpoCommand {
|
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
|
-
|
|
45
|
-
await logger.logToStderr("No client-side web parts available for this site");
|
|
46
|
-
}
|
|
47
|
-
if (clientSideWebParts.length > 0) {
|
|
48
|
-
await logger.log(clientSideWebParts);
|
|
49
|
-
}
|
|
44
|
+
await logger.log(clientSideWebParts);
|
|
50
45
|
}
|
|
51
46
|
catch (err) {
|
|
52
47
|
this.handleRejectedODataJsonPromise(err);
|
|
@@ -270,8 +270,8 @@ export default {
|
|
|
270
270
|
SITE_RECYCLEBINITEM_REMOVE: `${prefix} site recyclebinitem remove`,
|
|
271
271
|
SITE_RECYCLEBINITEM_RESTORE: `${prefix} site recyclebinitem restore`,
|
|
272
272
|
SITE_REMOVE: `${prefix} site remove`,
|
|
273
|
-
SITE_RENAME: `${prefix} site rename`,
|
|
274
273
|
SITE_SET: `${prefix} site set`,
|
|
274
|
+
SITE_SHARINGPERMISSION_SET: `${prefix} site sharingpermission set`,
|
|
275
275
|
SITE_CHROME_SET: `${prefix} site chrome set`,
|
|
276
276
|
SITEDESIGN_ADD: `${prefix} sitedesign add`,
|
|
277
277
|
SITEDESIGN_APPLY: `${prefix} sitedesign apply`,
|
|
@@ -321,6 +321,7 @@ export default {
|
|
|
321
321
|
TENANT_SETTINGS_LIST: `${prefix} tenant settings list`,
|
|
322
322
|
TENANT_SETTINGS_SET: `${prefix} tenant settings set`,
|
|
323
323
|
TENANT_SITE_ARCHIVE: `${prefix} tenant site archive`,
|
|
324
|
+
TENANT_SITE_RENAME: `${prefix} tenant site rename`,
|
|
324
325
|
TENANT_SITE_UNARCHIVE: `${prefix} tenant site unarchive`,
|
|
325
326
|
TERM_ADD: `${prefix} term add`,
|
|
326
327
|
TERM_GET: `${prefix} term get`,
|
|
@@ -29,9 +29,11 @@ class TeamsTabListCommand extends GraphCommand {
|
|
|
29
29
|
const endpoint = `${this.resource}/v1.0/teams/${args.options.teamId}/channels/${formatting.encodeQueryParameter(args.options.channelId)}/tabs?$expand=teamsApp`;
|
|
30
30
|
try {
|
|
31
31
|
const items = await odata.getAllItems(endpoint);
|
|
32
|
-
|
|
33
|
-
i
|
|
34
|
-
|
|
32
|
+
if (args.options.output !== 'json') {
|
|
33
|
+
items.forEach(i => {
|
|
34
|
+
i.teamsAppTabId = i.teamsApp.id;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
35
37
|
await logger.log(items);
|
|
36
38
|
}
|
|
37
39
|
catch (err) {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { odata } from '../../../../utils/odata.js';
|
|
2
|
+
import GraphCommand from '../../../base/GraphCommand.js';
|
|
3
|
+
import commands from '../../commands.js';
|
|
4
|
+
class VivaEngageCommunityListCommand extends GraphCommand {
|
|
5
|
+
get name() {
|
|
6
|
+
return commands.ENGAGE_COMMUNITY_LIST;
|
|
7
|
+
}
|
|
8
|
+
get description() {
|
|
9
|
+
return 'Lists all Viva Engage communities';
|
|
10
|
+
}
|
|
11
|
+
defaultProperties() {
|
|
12
|
+
return ['id', 'displayName', 'privacy'];
|
|
13
|
+
}
|
|
14
|
+
async commandAction(logger) {
|
|
15
|
+
if (this.verbose) {
|
|
16
|
+
await logger.logToStderr('Getting all Viva Engage communities...');
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const results = await odata.getAllItems(`${this.resource}/v1.0/employeeExperience/communities`);
|
|
20
|
+
await logger.log(results);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
this.handleRejectedODataJsonPromise(err);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export default new VivaEngageCommunityListCommand();
|
|
28
|
+
//# sourceMappingURL=engage-community-list.js.map
|
|
@@ -3,6 +3,7 @@ export default {
|
|
|
3
3
|
CONNECTIONS_APP_CREATE: `${prefix} connections app create`,
|
|
4
4
|
ENGAGE_COMMUNITY_ADD: `${prefix} engage community add`,
|
|
5
5
|
ENGAGE_COMMUNITY_GET: `${prefix} engage community get`,
|
|
6
|
+
ENGAGE_COMMUNITY_LIST: `${prefix} engage community list`,
|
|
6
7
|
ENGAGE_GROUP_LIST: `${prefix} engage group list`,
|
|
7
8
|
ENGAGE_GROUP_USER_ADD: `${prefix} engage group user add`,
|
|
8
9
|
ENGAGE_GROUP_USER_REMOVE: `${prefix} engage group user remove`,
|
package/dist/request.js
CHANGED
|
@@ -4,6 +4,7 @@ import auth, { Auth } from './Auth.js';
|
|
|
4
4
|
import { app } from './utils/app.js';
|
|
5
5
|
import { formatting } from './utils/formatting.js';
|
|
6
6
|
import { timings } from './cli/timings.js';
|
|
7
|
+
import { timersUtil } from './utils/timersUtil.js';
|
|
7
8
|
class Request {
|
|
8
9
|
set debug(debug) {
|
|
9
10
|
// if the value to set is the same as current value return early to avoid
|
|
@@ -125,76 +126,60 @@ class Request {
|
|
|
125
126
|
options.method = 'HEAD';
|
|
126
127
|
return this.execute(options);
|
|
127
128
|
}
|
|
128
|
-
execute(options
|
|
129
|
+
async execute(options) {
|
|
129
130
|
const start = process.hrtime.bigint();
|
|
130
131
|
if (!this._logger) {
|
|
131
|
-
|
|
132
|
+
throw 'Logger not set on the request object';
|
|
132
133
|
}
|
|
133
134
|
this.updateRequestForCloudType(options, auth.connection.cloudType);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
.
|
|
146
|
-
|
|
147
|
-
if (options.headers['x-anonymous']) {
|
|
148
|
-
delete options.headers['x-anonymous'];
|
|
149
|
-
}
|
|
150
|
-
if (options.headers['x-resource']) {
|
|
151
|
-
delete options.headers['x-resource'];
|
|
152
|
-
}
|
|
153
|
-
if (accessToken !== '') {
|
|
154
|
-
options.headers.authorization = `Bearer ${accessToken}`;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
const proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;
|
|
158
|
-
if (proxyUrl) {
|
|
159
|
-
options.proxy = this.createProxyConfigFromUrl(proxyUrl);
|
|
135
|
+
try {
|
|
136
|
+
let accessToken = '';
|
|
137
|
+
if (options.headers && options.headers['x-anonymous']) {
|
|
138
|
+
accessToken = '';
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const url = options.headers && options.headers['x-resource'] ? options.headers['x-resource'] : options.url;
|
|
142
|
+
const resource = Auth.getResourceFromUrl(url);
|
|
143
|
+
accessToken = await auth.ensureAccessToken(resource, this._logger, this._debug);
|
|
144
|
+
}
|
|
145
|
+
if (options.headers) {
|
|
146
|
+
if (options.headers['x-anonymous']) {
|
|
147
|
+
delete options.headers['x-anonymous'];
|
|
160
148
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
.then((res) => {
|
|
164
|
-
if (resolve) {
|
|
165
|
-
resolve((options.responseType === 'stream' || options.fullResponse) ? res : res.data);
|
|
149
|
+
if (options.headers['x-resource']) {
|
|
150
|
+
delete options.headers['x-resource'];
|
|
166
151
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
timings.api.push(Number(end - start));
|
|
170
|
-
_resolve((options.responseType === 'stream' || options.fullResponse) ? res : res.data);
|
|
152
|
+
if (accessToken !== '') {
|
|
153
|
+
options.headers.authorization = `Bearer ${accessToken}`;
|
|
171
154
|
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
155
|
+
}
|
|
156
|
+
const proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;
|
|
157
|
+
if (proxyUrl) {
|
|
158
|
+
options.proxy = this.createProxyConfigFromUrl(proxyUrl);
|
|
159
|
+
}
|
|
160
|
+
const res = await this.req(options);
|
|
161
|
+
const end = process.hrtime.bigint();
|
|
162
|
+
timings.api.push(Number(end - start));
|
|
163
|
+
return options.responseType === 'stream' || options.fullResponse ?
|
|
164
|
+
res :
|
|
165
|
+
res.data;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
const end = process.hrtime.bigint();
|
|
169
|
+
timings.api.push(Number(end - start));
|
|
170
|
+
if (error && error.response && (error.response.status === 429 || error.response.status === 503)) {
|
|
171
|
+
let retryAfter = parseInt(error.response.headers['retry-after'] || '10');
|
|
172
|
+
if (isNaN(retryAfter)) {
|
|
173
|
+
retryAfter = 10;
|
|
185
174
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
reject(error);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
const end = process.hrtime.bigint();
|
|
192
|
-
timings.api.push(Number(end - start));
|
|
193
|
-
_reject(error);
|
|
194
|
-
}
|
|
175
|
+
if (this._debug) {
|
|
176
|
+
await this._logger.log(`Request throttled. Waiting ${retryAfter} sec before retrying...`);
|
|
195
177
|
}
|
|
196
|
-
|
|
197
|
-
|
|
178
|
+
await timersUtil.setTimeout(retryAfter * 1000);
|
|
179
|
+
return this.execute(options);
|
|
180
|
+
}
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
198
183
|
}
|
|
199
184
|
updateRequestForCloudType(options, cloudType) {
|
|
200
185
|
const url = new URL(options.url);
|
package/dist/utils/spo.js
CHANGED
|
@@ -1617,7 +1617,7 @@ export const spo = {
|
|
|
1617
1617
|
return objectInfo;
|
|
1618
1618
|
},
|
|
1619
1619
|
/**
|
|
1620
|
-
* Gets the
|
|
1620
|
+
* Gets the primary owner login from a site as admin.
|
|
1621
1621
|
* @param adminUrl The SharePoint admin URL
|
|
1622
1622
|
* @param siteId The site ID
|
|
1623
1623
|
* @param logger The logger object
|
|
@@ -1631,13 +1631,12 @@ export const spo = {
|
|
|
1631
1631
|
const requestOptions = {
|
|
1632
1632
|
url: `${adminUrl}/_api/SPO.Tenant/sites('${siteId}')?$select=OwnerLoginName`,
|
|
1633
1633
|
headers: {
|
|
1634
|
-
accept: 'application/json;odata=nometadata'
|
|
1635
|
-
|
|
1636
|
-
|
|
1634
|
+
accept: 'application/json;odata=nometadata'
|
|
1635
|
+
},
|
|
1636
|
+
responseType: 'json'
|
|
1637
1637
|
};
|
|
1638
1638
|
const response = await request.get(requestOptions);
|
|
1639
|
-
|
|
1640
|
-
return responseContent.OwnerLoginName;
|
|
1639
|
+
return response.OwnerLoginName;
|
|
1641
1640
|
},
|
|
1642
1641
|
/**
|
|
1643
1642
|
* Gets the primary owner login from a site.
|
|
@@ -1652,7 +1651,6 @@ export const spo = {
|
|
|
1652
1651
|
}
|
|
1653
1652
|
const requestOptions = {
|
|
1654
1653
|
url: `${siteUrl}/_api/site/owner`,
|
|
1655
|
-
method: 'GET',
|
|
1656
1654
|
headers: {
|
|
1657
1655
|
'accept': 'application/json;odata=nometadata'
|
|
1658
1656
|
},
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { setTimeout } from "timers/promises";
|
|
2
|
+
export const timersUtil = {
|
|
3
|
+
/**
|
|
4
|
+
* Timeout for a specific duration.
|
|
5
|
+
* @param duration Duration in milliseconds.
|
|
6
|
+
*/
|
|
7
|
+
/* c8 ignore next 3 */
|
|
8
|
+
async setTimeout(duration) {
|
|
9
|
+
return setTimeout(duration);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=timersUtil.js.map
|
package/dist/utils/urlUtil.js
CHANGED
|
@@ -198,6 +198,14 @@ export const urlUtil = {
|
|
|
198
198
|
return rootUrl.origin;
|
|
199
199
|
}
|
|
200
200
|
},
|
|
201
|
+
/**
|
|
202
|
+
* Removes leading slashes from the URL.
|
|
203
|
+
* @param url The URL to process.
|
|
204
|
+
* @returns The URL without leading slashes.
|
|
205
|
+
*/
|
|
206
|
+
removeLeadingSlashes(url) {
|
|
207
|
+
return url.replace(/^\/+/, '');
|
|
208
|
+
},
|
|
201
209
|
/**
|
|
202
210
|
* Removes trailing slashes from the URL.
|
|
203
211
|
* @param url The URL to process.
|