@pnp/cli-microsoft365 10.6.0-beta.36bb898 → 10.6.0-beta.3facb8f
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 +3 -1
- package/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Command.js +4 -26
- package/dist/config.js +1 -0
- package/dist/m365/adaptivecard/commands/adaptivecard-send.js +2 -1
- package/dist/m365/base/SpoCommand.js +2 -1
- package/dist/m365/commands/request.js +3 -12
- package/dist/m365/commands/setup.js +2 -0
- package/dist/m365/entra/commands/administrativeunit/administrativeunit-add.js +10 -5
- package/dist/m365/entra/commands/app/app-add.js +5 -0
- package/dist/m365/entra/commands/app/app-set.js +23 -0
- package/dist/m365/entra/commands/group/group-add.js +1 -0
- package/dist/m365/entra/commands/group/group-set.js +12 -6
- package/dist/m365/entra/commands/user/user-add.js +1 -0
- package/dist/m365/entra/commands/user/user-list.js +2 -1
- package/dist/m365/external/commands/item/item-add.js +2 -1
- package/dist/m365/graph/commands/openextension/openextension-add.js +73 -0
- package/dist/m365/graph/commands.js +1 -0
- package/dist/m365/spo/commands/folder/folder-roleassignment-add.js +12 -47
- package/dist/m365/spo/commands/folder/folder-roleassignment-remove.js +13 -31
- package/dist/m365/spo/commands/listitem/listitem-roleassignment-add.js +12 -43
- package/dist/m365/spo/commands/listitem/listitem-roleassignment-remove.js +8 -27
- package/dist/m365/spo/commands/web/web-roleassignment-add.js +22 -47
- package/dist/m365/spo/commands/web/web-roleassignment-remove.js +17 -32
- package/dist/m365/tenant/commands/people/people-profilecardproperty-add.js +4 -3
- package/dist/m365/tenant/commands/people/people-profilecardproperty-set.js +4 -3
- package/dist/m365/todo/commands/list/list-remove.js +1 -1
- package/dist/utils/entraApp.js +3 -1
- package/dist/utils/optionsUtils.js +28 -0
- package/dist/utils/spo.js +32 -3
- package/docs/docs/cmd/graph/directoryextension/directoryextension-get.mdx +2 -3
- package/docs/docs/cmd/graph/openextension/openextension-add.mdx +120 -0
- package/package.json +1 -1
|
@@ -4,7 +4,6 @@ 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 _SpoListItemRoleAssignmentAddCommand_instances, _SpoListItemRoleAssignmentAddCommand_initTelemetry, _SpoListItemRoleAssignmentAddCommand_initOptions, _SpoListItemRoleAssignmentAddCommand_initValidators;
|
|
7
|
-
import { cli } from '../../../../cli/cli.js';
|
|
8
7
|
import request from '../../../../request.js';
|
|
9
8
|
import { entraGroup } from '../../../../utils/entraGroup.js';
|
|
10
9
|
import { formatting } from '../../../../utils/formatting.js';
|
|
@@ -12,9 +11,6 @@ import { urlUtil } from '../../../../utils/urlUtil.js';
|
|
|
12
11
|
import { validation } from '../../../../utils/validation.js';
|
|
13
12
|
import SpoCommand from '../../../base/SpoCommand.js';
|
|
14
13
|
import commands from '../../commands.js';
|
|
15
|
-
import spoGroupGetCommand from '../group/group-get.js';
|
|
16
|
-
import spoRoleDefinitionListCommand from '../roledefinition/roledefinition-list.js';
|
|
17
|
-
import spoUserGetCommand from '../user/user-get.js';
|
|
18
14
|
import { spo } from '../../../../utils/spo.js';
|
|
19
15
|
class SpoListItemRoleAssignmentAddCommand extends SpoCommand {
|
|
20
16
|
get name() {
|
|
@@ -47,15 +43,13 @@ class SpoListItemRoleAssignmentAddCommand extends SpoCommand {
|
|
|
47
43
|
requestUrl += `GetList('${formatting.encodeQueryParameter(listServerRelativeUrl)}')/`;
|
|
48
44
|
}
|
|
49
45
|
requestUrl += `items(${args.options.listItemId})/`;
|
|
50
|
-
const roleDefinitionId = await this.getRoleDefinitionId(args.options);
|
|
46
|
+
const roleDefinitionId = await this.getRoleDefinitionId(args.options, logger);
|
|
51
47
|
let principalId = args.options.principalId;
|
|
52
48
|
if (args.options.upn) {
|
|
53
|
-
principalId = await this.getUserPrincipalId(args.options);
|
|
54
|
-
await this.addRoleAssignment(requestUrl, roleDefinitionId, principalId);
|
|
49
|
+
principalId = await this.getUserPrincipalId(args.options, logger);
|
|
55
50
|
}
|
|
56
51
|
else if (args.options.groupName) {
|
|
57
|
-
principalId = await this.getGroupPrincipalId(args.options);
|
|
58
|
-
await this.addRoleAssignment(requestUrl, roleDefinitionId, principalId);
|
|
52
|
+
principalId = await this.getGroupPrincipalId(args.options, logger);
|
|
59
53
|
}
|
|
60
54
|
else if (args.options.entraGroupId || args.options.entraGroupName) {
|
|
61
55
|
if (this.verbose) {
|
|
@@ -85,45 +79,20 @@ class SpoListItemRoleAssignmentAddCommand extends SpoCommand {
|
|
|
85
79
|
};
|
|
86
80
|
await request.post(requestOptions);
|
|
87
81
|
}
|
|
88
|
-
async getRoleDefinitionId(options) {
|
|
82
|
+
async getRoleDefinitionId(options, logger) {
|
|
89
83
|
if (!options.roleDefinitionName) {
|
|
90
84
|
return options.roleDefinitionId;
|
|
91
85
|
}
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
output: 'json',
|
|
95
|
-
debug: this.debug,
|
|
96
|
-
verbose: this.verbose
|
|
97
|
-
};
|
|
98
|
-
const output = await cli.executeCommandWithOutput(spoRoleDefinitionListCommand, { options: { ...roleDefinitionListCommandOptions, _: [] } });
|
|
99
|
-
const getRoleDefinitionListOutput = JSON.parse(output.stdout);
|
|
100
|
-
const roleDefinitionId = getRoleDefinitionListOutput.find((role) => role.Name === options.roleDefinitionName).Id;
|
|
101
|
-
return roleDefinitionId;
|
|
86
|
+
const roleDefintion = await spo.getRoleDefinitionByName(options.webUrl, options.roleDefinitionName, logger, this.verbose);
|
|
87
|
+
return roleDefintion.Id;
|
|
102
88
|
}
|
|
103
|
-
async getGroupPrincipalId(options) {
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
name: options.groupName,
|
|
107
|
-
output: 'json',
|
|
108
|
-
debug: this.debug,
|
|
109
|
-
verbose: this.verbose
|
|
110
|
-
};
|
|
111
|
-
const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
|
|
112
|
-
const getGroupOutput = JSON.parse(output.stdout);
|
|
113
|
-
return getGroupOutput.Id;
|
|
89
|
+
async getGroupPrincipalId(options, logger) {
|
|
90
|
+
const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
|
|
91
|
+
return group.Id;
|
|
114
92
|
}
|
|
115
|
-
async getUserPrincipalId(options) {
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
email: options.upn,
|
|
119
|
-
id: undefined,
|
|
120
|
-
output: 'json',
|
|
121
|
-
debug: this.debug,
|
|
122
|
-
verbose: this.verbose
|
|
123
|
-
};
|
|
124
|
-
const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
|
|
125
|
-
const getUserOutput = JSON.parse(output.stdout);
|
|
126
|
-
return getUserOutput.Id;
|
|
93
|
+
async getUserPrincipalId(options, logger) {
|
|
94
|
+
const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
|
|
95
|
+
return user.Id;
|
|
127
96
|
}
|
|
128
97
|
}
|
|
129
98
|
_SpoListItemRoleAssignmentAddCommand_instances = new WeakSet(), _SpoListItemRoleAssignmentAddCommand_initTelemetry = function _SpoListItemRoleAssignmentAddCommand_initTelemetry() {
|
|
@@ -11,8 +11,6 @@ import { urlUtil } from '../../../../utils/urlUtil.js';
|
|
|
11
11
|
import { validation } from '../../../../utils/validation.js';
|
|
12
12
|
import SpoCommand from '../../../base/SpoCommand.js';
|
|
13
13
|
import commands from '../../commands.js';
|
|
14
|
-
import spoGroupGetCommand from '../group/group-get.js';
|
|
15
|
-
import spoUserGetCommand from '../user/user-get.js';
|
|
16
14
|
import { entraGroup } from '../../../../utils/entraGroup.js';
|
|
17
15
|
import { spo } from '../../../../utils/spo.js';
|
|
18
16
|
class SpoListItemRoleAssignmentRemoveCommand extends SpoCommand {
|
|
@@ -59,10 +57,10 @@ class SpoListItemRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
59
57
|
}
|
|
60
58
|
requestUrl += `items(${options.listItemId})/`;
|
|
61
59
|
if (options.upn) {
|
|
62
|
-
options.principalId = await this.getUserPrincipalId(options);
|
|
60
|
+
options.principalId = await this.getUserPrincipalId(options, logger);
|
|
63
61
|
}
|
|
64
62
|
else if (options.groupName) {
|
|
65
|
-
options.principalId = await this.getGroupPrincipalId(options);
|
|
63
|
+
options.principalId = await this.getGroupPrincipalId(options, logger);
|
|
66
64
|
}
|
|
67
65
|
else if (options.entraGroupId || options.entraGroupName) {
|
|
68
66
|
if (this.verbose) {
|
|
@@ -92,30 +90,13 @@ class SpoListItemRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
92
90
|
};
|
|
93
91
|
await request.post(requestOptions);
|
|
94
92
|
}
|
|
95
|
-
async getGroupPrincipalId(options) {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
name: options.groupName,
|
|
99
|
-
output: 'json',
|
|
100
|
-
debug: this.debug,
|
|
101
|
-
verbose: this.verbose
|
|
102
|
-
};
|
|
103
|
-
const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
|
|
104
|
-
const getGroupOutput = JSON.parse(output.stdout);
|
|
105
|
-
return getGroupOutput.Id;
|
|
93
|
+
async getGroupPrincipalId(options, logger) {
|
|
94
|
+
const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
|
|
95
|
+
return group.Id;
|
|
106
96
|
}
|
|
107
|
-
async getUserPrincipalId(options) {
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
email: options.upn,
|
|
111
|
-
id: undefined,
|
|
112
|
-
output: 'json',
|
|
113
|
-
debug: this.debug,
|
|
114
|
-
verbose: this.verbose
|
|
115
|
-
};
|
|
116
|
-
const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
|
|
117
|
-
const getUserOutput = JSON.parse(output.stdout);
|
|
118
|
-
return getUserOutput.Id;
|
|
97
|
+
async getUserPrincipalId(options, logger) {
|
|
98
|
+
const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
|
|
99
|
+
return user.Id;
|
|
119
100
|
}
|
|
120
101
|
}
|
|
121
102
|
_SpoListItemRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoListItemRoleAssignmentRemoveCommand_initTelemetry = function _SpoListItemRoleAssignmentRemoveCommand_initTelemetry() {
|
|
@@ -4,16 +4,12 @@ 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 _SpoWebRoleAssignmentAddCommand_instances, _SpoWebRoleAssignmentAddCommand_initTelemetry, _SpoWebRoleAssignmentAddCommand_initOptions, _SpoWebRoleAssignmentAddCommand_initValidators, _SpoWebRoleAssignmentAddCommand_initOptionSets;
|
|
7
|
-
import { cli } from '../../../../cli/cli.js';
|
|
8
7
|
import request from '../../../../request.js';
|
|
8
|
+
import { entraGroup } from '../../../../utils/entraGroup.js';
|
|
9
|
+
import { spo } from '../../../../utils/spo.js';
|
|
9
10
|
import { validation } from '../../../../utils/validation.js';
|
|
10
11
|
import SpoCommand from '../../../base/SpoCommand.js';
|
|
11
12
|
import commands from '../../commands.js';
|
|
12
|
-
import spoGroupGetCommand from '../group/group-get.js';
|
|
13
|
-
import spoRoleDefinitionListCommand from '../roledefinition/roledefinition-list.js';
|
|
14
|
-
import spoUserGetCommand from '../user/user-get.js';
|
|
15
|
-
import { entraGroup } from '../../../../utils/entraGroup.js';
|
|
16
|
-
import { spo } from '../../../../utils/spo.js';
|
|
17
13
|
class SpoWebRoleAssignmentAddCommand extends SpoCommand {
|
|
18
14
|
get name() {
|
|
19
15
|
return commands.WEB_ROLEASSIGNMENT_ADD;
|
|
@@ -34,12 +30,14 @@ class SpoWebRoleAssignmentAddCommand extends SpoCommand {
|
|
|
34
30
|
await logger.logToStderr(`Adding role assignment to web ${args.options.webUrl}...`);
|
|
35
31
|
}
|
|
36
32
|
try {
|
|
37
|
-
|
|
33
|
+
const roleDefinitionId = await this.getRoleDefinitionId(args.options, logger);
|
|
38
34
|
if (args.options.upn) {
|
|
39
|
-
|
|
35
|
+
const principalId = await this.getUserPrincipalId(args.options, logger);
|
|
36
|
+
await this.addRoleAssignment(args.options.webUrl, principalId, roleDefinitionId, logger);
|
|
40
37
|
}
|
|
41
38
|
else if (args.options.groupName) {
|
|
42
|
-
|
|
39
|
+
const principalId = await this.getGroupPrincipalId(args.options, logger);
|
|
40
|
+
await this.addRoleAssignment(args.options.webUrl, principalId, roleDefinitionId, logger);
|
|
43
41
|
}
|
|
44
42
|
else if (args.options.entraGroupId || args.options.entraGroupName) {
|
|
45
43
|
if (this.verbose) {
|
|
@@ -49,17 +47,19 @@ class SpoWebRoleAssignmentAddCommand extends SpoCommand {
|
|
|
49
47
|
? await entraGroup.getGroupById(args.options.entraGroupId)
|
|
50
48
|
: await entraGroup.getGroupByDisplayName(args.options.entraGroupName);
|
|
51
49
|
const siteUser = await spo.ensureEntraGroup(args.options.webUrl, group);
|
|
52
|
-
args.options.
|
|
50
|
+
await this.addRoleAssignment(args.options.webUrl, siteUser.Id, roleDefinitionId, logger);
|
|
53
51
|
}
|
|
54
|
-
await this.addRoleAssignment(logger, args.options);
|
|
55
52
|
}
|
|
56
53
|
catch (err) {
|
|
57
54
|
this.handleRejectedODataJsonPromise(err);
|
|
58
55
|
}
|
|
59
56
|
}
|
|
60
|
-
async addRoleAssignment(
|
|
57
|
+
async addRoleAssignment(webUrl, principalId, roleDefinitionId, logger) {
|
|
58
|
+
if (this.verbose) {
|
|
59
|
+
await logger.logToStderr('Adding role assignment...');
|
|
60
|
+
}
|
|
61
61
|
const requestOptions = {
|
|
62
|
-
url: `${
|
|
62
|
+
url: `${webUrl}/_api/web/roleassignments/addroleassignment(principalid='${principalId}',roledefid='${roleDefinitionId}')`,
|
|
63
63
|
method: 'POST',
|
|
64
64
|
headers: {
|
|
65
65
|
'accept': 'application/json;odata=nometadata',
|
|
@@ -69,45 +69,20 @@ class SpoWebRoleAssignmentAddCommand extends SpoCommand {
|
|
|
69
69
|
};
|
|
70
70
|
await request.post(requestOptions);
|
|
71
71
|
}
|
|
72
|
-
async getRoleDefinitionId(options) {
|
|
72
|
+
async getRoleDefinitionId(options, logger) {
|
|
73
73
|
if (!options.roleDefinitionName) {
|
|
74
74
|
return options.roleDefinitionId;
|
|
75
75
|
}
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
output: 'json',
|
|
79
|
-
debug: this.debug,
|
|
80
|
-
verbose: this.verbose
|
|
81
|
-
};
|
|
82
|
-
const output = await cli.executeCommandWithOutput(spoRoleDefinitionListCommand, { options: { ...roleDefinitionListCommandOptions, _: [] } });
|
|
83
|
-
const getRoleDefinitionListOutput = JSON.parse(output.stdout);
|
|
84
|
-
const roleDefinitionId = getRoleDefinitionListOutput.find((role) => role.Name === options.roleDefinitionName).Id;
|
|
85
|
-
return roleDefinitionId;
|
|
76
|
+
const roledefinition = await spo.getRoleDefinitionByName(options.webUrl, options.roleDefinitionName, logger, this.verbose);
|
|
77
|
+
return roledefinition.Id;
|
|
86
78
|
}
|
|
87
|
-
async getGroupPrincipalId(options) {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
name: options.groupName,
|
|
91
|
-
output: 'json',
|
|
92
|
-
debug: this.debug,
|
|
93
|
-
verbose: this.verbose
|
|
94
|
-
};
|
|
95
|
-
const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
|
|
96
|
-
const getGroupOutput = JSON.parse(output.stdout);
|
|
97
|
-
return getGroupOutput.Id;
|
|
79
|
+
async getGroupPrincipalId(options, logger) {
|
|
80
|
+
const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
|
|
81
|
+
return group.Id;
|
|
98
82
|
}
|
|
99
|
-
async getUserPrincipalId(options) {
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
email: options.upn,
|
|
103
|
-
id: undefined,
|
|
104
|
-
output: 'json',
|
|
105
|
-
debug: this.debug,
|
|
106
|
-
verbose: this.verbose
|
|
107
|
-
};
|
|
108
|
-
const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
|
|
109
|
-
const getUserOutput = JSON.parse(output.stdout);
|
|
110
|
-
return getUserOutput.Id;
|
|
83
|
+
async getUserPrincipalId(options, logger) {
|
|
84
|
+
const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
|
|
85
|
+
return user.Id;
|
|
111
86
|
}
|
|
112
87
|
}
|
|
113
88
|
_SpoWebRoleAssignmentAddCommand_instances = new WeakSet(), _SpoWebRoleAssignmentAddCommand_initTelemetry = function _SpoWebRoleAssignmentAddCommand_initTelemetry() {
|
|
@@ -4,15 +4,13 @@ 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 _SpoWebRoleAssignmentRemoveCommand_instances, _SpoWebRoleAssignmentRemoveCommand_initTelemetry, _SpoWebRoleAssignmentRemoveCommand_initOptions, _SpoWebRoleAssignmentRemoveCommand_initValidators, _SpoWebRoleAssignmentRemoveCommand_initOptionSets;
|
|
7
|
-
import { cli } from '../../../../cli/cli.js';
|
|
8
7
|
import request from '../../../../request.js';
|
|
9
8
|
import { validation } from '../../../../utils/validation.js';
|
|
10
9
|
import SpoCommand from '../../../base/SpoCommand.js';
|
|
11
10
|
import commands from '../../commands.js';
|
|
12
|
-
import spoGroupGetCommand from '../group/group-get.js';
|
|
13
|
-
import spoUserGetCommand from '../user/user-get.js';
|
|
14
11
|
import { entraGroup } from '../../../../utils/entraGroup.js';
|
|
15
12
|
import { spo } from '../../../../utils/spo.js';
|
|
13
|
+
import { cli } from '../../../../cli/cli.js';
|
|
16
14
|
class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
|
|
17
15
|
get name() {
|
|
18
16
|
return commands.WEB_ROLEASSIGNMENT_REMOVE;
|
|
@@ -45,10 +43,12 @@ class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
45
43
|
}
|
|
46
44
|
try {
|
|
47
45
|
if (options.upn) {
|
|
48
|
-
|
|
46
|
+
const principalId = await this.getUserPrincipalId(options, logger);
|
|
47
|
+
await this.removeRoleAssignmentWithOptions(options.webUrl, principalId, logger);
|
|
49
48
|
}
|
|
50
49
|
else if (options.groupName) {
|
|
51
|
-
|
|
50
|
+
const principalId = await this.getGroupPrincipalId(options, logger);
|
|
51
|
+
await this.removeRoleAssignmentWithOptions(options.webUrl, principalId, logger);
|
|
52
52
|
}
|
|
53
53
|
else if (options.entraGroupId || options.entraGroupName) {
|
|
54
54
|
if (this.verbose) {
|
|
@@ -58,17 +58,19 @@ class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
58
58
|
? await entraGroup.getGroupById(options.entraGroupId)
|
|
59
59
|
: await entraGroup.getGroupByDisplayName(options.entraGroupName);
|
|
60
60
|
const siteUser = await spo.ensureEntraGroup(options.webUrl, group);
|
|
61
|
-
options.
|
|
61
|
+
await this.removeRoleAssignmentWithOptions(options.webUrl, siteUser.Id, logger);
|
|
62
62
|
}
|
|
63
|
-
await this.removeRoleAssignmentWithOptions(logger, options);
|
|
64
63
|
}
|
|
65
64
|
catch (err) {
|
|
66
65
|
this.handleRejectedODataJsonPromise(err);
|
|
67
66
|
}
|
|
68
67
|
}
|
|
69
|
-
async removeRoleAssignmentWithOptions(
|
|
68
|
+
async removeRoleAssignmentWithOptions(webUrl, principalId, logger) {
|
|
69
|
+
if (this.verbose) {
|
|
70
|
+
await logger.logToStderr('Removing role assignment...');
|
|
71
|
+
}
|
|
70
72
|
const requestOptions = {
|
|
71
|
-
url: `${
|
|
73
|
+
url: `${webUrl}/_api/web/roleassignments/removeroleassignment(principalid='${principalId}')`,
|
|
72
74
|
method: 'POST',
|
|
73
75
|
headers: {
|
|
74
76
|
'accept': 'application/json;odata=nometadata',
|
|
@@ -78,30 +80,13 @@ class SpoWebRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
78
80
|
};
|
|
79
81
|
await request.post(requestOptions);
|
|
80
82
|
}
|
|
81
|
-
async getGroupPrincipalId(options) {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
name: options.groupName,
|
|
85
|
-
output: 'json',
|
|
86
|
-
debug: this.debug,
|
|
87
|
-
verbose: this.verbose
|
|
88
|
-
};
|
|
89
|
-
const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
|
|
90
|
-
const getGroupOutput = JSON.parse(output.stdout);
|
|
91
|
-
return getGroupOutput.Id;
|
|
83
|
+
async getGroupPrincipalId(options, logger) {
|
|
84
|
+
const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
|
|
85
|
+
return group.Id;
|
|
92
86
|
}
|
|
93
|
-
async getUserPrincipalId(options) {
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
email: options.upn,
|
|
97
|
-
id: undefined,
|
|
98
|
-
output: 'json',
|
|
99
|
-
debug: this.debug,
|
|
100
|
-
verbose: this.verbose
|
|
101
|
-
};
|
|
102
|
-
const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
|
|
103
|
-
const getUserOutput = JSON.parse(output.stdout);
|
|
104
|
-
return getUserOutput.Id;
|
|
87
|
+
async getUserPrincipalId(options, logger) {
|
|
88
|
+
const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
|
|
89
|
+
return user.Id;
|
|
105
90
|
}
|
|
106
91
|
}
|
|
107
92
|
_SpoWebRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoWebRoleAssignmentRemoveCommand_initTelemetry = function _SpoWebRoleAssignmentRemoveCommand_initTelemetry() {
|
|
@@ -5,6 +5,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
5
5
|
};
|
|
6
6
|
var _TenantPeopleProfileCardPropertyAddCommand_instances, _TenantPeopleProfileCardPropertyAddCommand_initTelemetry, _TenantPeopleProfileCardPropertyAddCommand_initOptions, _TenantPeopleProfileCardPropertyAddCommand_initValidators;
|
|
7
7
|
import request from '../../../../request.js';
|
|
8
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
8
9
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
9
10
|
import commands from '../../commands.js';
|
|
10
11
|
import { profileCardPropertyNames } from './profileCardProperties.js';
|
|
@@ -71,7 +72,7 @@ class TenantPeopleProfileCardPropertyAddCommand extends GraphCommand {
|
|
|
71
72
|
];
|
|
72
73
|
}
|
|
73
74
|
getLocalizations(options) {
|
|
74
|
-
const unknownOptions = Object.keys(
|
|
75
|
+
const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(options, this.options));
|
|
75
76
|
if (unknownOptions.length === 0) {
|
|
76
77
|
return [];
|
|
77
78
|
}
|
|
@@ -88,7 +89,7 @@ class TenantPeopleProfileCardPropertyAddCommand extends GraphCommand {
|
|
|
88
89
|
_TenantPeopleProfileCardPropertyAddCommand_instances = new WeakSet(), _TenantPeopleProfileCardPropertyAddCommand_initTelemetry = function _TenantPeopleProfileCardPropertyAddCommand_initTelemetry() {
|
|
89
90
|
this.telemetry.push((args) => {
|
|
90
91
|
// Add unknown options to telemetry
|
|
91
|
-
const unknownOptions = Object.keys(
|
|
92
|
+
const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
|
|
92
93
|
const unknownOptionsObj = unknownOptions.reduce((obj, key) => ({ ...obj, [key]: true }), {});
|
|
93
94
|
Object.assign(this.telemetryProperties, {
|
|
94
95
|
displayName: typeof args.options.displayName !== 'undefined',
|
|
@@ -114,7 +115,7 @@ _TenantPeopleProfileCardPropertyAddCommand_instances = new WeakSet(), _TenantPeo
|
|
|
114
115
|
if (!propertyName.startsWith('customattribute') && args.options.displayName !== undefined) {
|
|
115
116
|
return `The option 'displayName' can only be used when adding customAttributes as profile card properties`;
|
|
116
117
|
}
|
|
117
|
-
const unknownOptions = Object.keys(
|
|
118
|
+
const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
|
|
118
119
|
if (!propertyName.startsWith('customattribute') && unknownOptions.length > 0) {
|
|
119
120
|
return `Unknown options like ${unknownOptions.join(', ')} are only supported with customAttributes`;
|
|
120
121
|
}
|
|
@@ -8,6 +8,7 @@ import GraphCommand from '../../../base/GraphCommand.js';
|
|
|
8
8
|
import request from '../../../../request.js';
|
|
9
9
|
import { profileCardPropertyNames as allProfileCardPropertyNames } from './profileCardProperties.js';
|
|
10
10
|
import commands from '../../commands.js';
|
|
11
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
11
12
|
class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
|
|
12
13
|
get name() {
|
|
13
14
|
return commands.PEOPLE_PROFILECARDPROPERTY_SET;
|
|
@@ -73,7 +74,7 @@ class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
|
|
|
73
74
|
* @example Transform "--displayName-en-US 'Cost center'" to { languageTag: 'en-US', displayName: 'Cost center' }
|
|
74
75
|
*/
|
|
75
76
|
getLocalizations(options) {
|
|
76
|
-
const unknownOptions =
|
|
77
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
77
78
|
const result = Object.keys(unknownOptions).map(o => ({
|
|
78
79
|
languageTag: o.substring(o.indexOf('-') + 1),
|
|
79
80
|
displayName: unknownOptions[o]
|
|
@@ -84,7 +85,7 @@ class TenantPeopleProfileCardPropertySetCommand extends GraphCommand {
|
|
|
84
85
|
_TenantPeopleProfileCardPropertySetCommand_instances = new WeakSet(), _TenantPeopleProfileCardPropertySetCommand_initTelemetry = function _TenantPeopleProfileCardPropertySetCommand_initTelemetry() {
|
|
85
86
|
this.telemetry.push((args) => {
|
|
86
87
|
// Add unknown options to telemetry
|
|
87
|
-
const unknownOptions = Object.keys(
|
|
88
|
+
const unknownOptions = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
|
|
88
89
|
const unknownOptionsObj = unknownOptions.reduce((obj, key) => ({ ...obj, [key]: true }), {});
|
|
89
90
|
Object.assign(this.telemetryProperties, {
|
|
90
91
|
displayName: typeof args.options.displayName !== 'undefined',
|
|
@@ -104,7 +105,7 @@ _TenantPeopleProfileCardPropertySetCommand_instances = new WeakSet(), _TenantPeo
|
|
|
104
105
|
return `'${args.options.name}' is not a valid value for option name. Allowed values are: ${this.profileCardPropertyNames.join(', ')}.`;
|
|
105
106
|
}
|
|
106
107
|
// Unknown options are allowed only if they start with 'displayName-'
|
|
107
|
-
const unknownOptionKeys = Object.keys(
|
|
108
|
+
const unknownOptionKeys = Object.keys(optionsUtils.getUnknownOptions(args.options, this.options));
|
|
108
109
|
const invalidOptionKey = unknownOptionKeys.find(o => !o.startsWith('displayName-'));
|
|
109
110
|
if (invalidOptionKey) {
|
|
110
111
|
return `Invalid option: '${invalidOptionKey}'`;
|
|
@@ -46,7 +46,7 @@ class TodoListRemoveCommand extends DelegatedGraphCommand {
|
|
|
46
46
|
responseType: 'json'
|
|
47
47
|
};
|
|
48
48
|
const response = await request.get(requestOptions);
|
|
49
|
-
return response.value && response.value.length === 1 ? response.value[0].id :
|
|
49
|
+
return response.value && response.value.length === 1 ? response.value[0].id : undefined;
|
|
50
50
|
}
|
|
51
51
|
async removeList(args) {
|
|
52
52
|
try {
|
package/dist/utils/entraApp.js
CHANGED
|
@@ -3,6 +3,7 @@ import request from '../request.js';
|
|
|
3
3
|
import { odata } from './odata.js';
|
|
4
4
|
import { formatting } from './formatting.js';
|
|
5
5
|
import { cli } from '../cli/cli.js';
|
|
6
|
+
import { optionsUtils } from './optionsUtils.js';
|
|
6
7
|
async function getCertificateBase64Encoded({ options, logger, debug }) {
|
|
7
8
|
if (options.certificateBase64Encoded) {
|
|
8
9
|
return options.certificateBase64Encoded;
|
|
@@ -129,7 +130,7 @@ function updateAppPermissions({ spId, resourceAccessPermission, oAuth2Permission
|
|
|
129
130
|
}
|
|
130
131
|
export const entraApp = {
|
|
131
132
|
appPermissions: [],
|
|
132
|
-
createAppRegistration: async ({ options, apis, logger, verbose, debug }) => {
|
|
133
|
+
createAppRegistration: async ({ options, apis, logger, verbose, debug, unknownOptions }) => {
|
|
133
134
|
const applicationInfo = {
|
|
134
135
|
displayName: options.name,
|
|
135
136
|
signInAudience: options.multitenant ? 'AzureADMultipleOrgs' : 'AzureADMyOrg'
|
|
@@ -164,6 +165,7 @@ export const entraApp = {
|
|
|
164
165
|
if (options.allowPublicClientFlows) {
|
|
165
166
|
applicationInfo.isFallbackPublicClient = true;
|
|
166
167
|
}
|
|
168
|
+
optionsUtils.addUnknownOptionsToPayload(applicationInfo, unknownOptions);
|
|
167
169
|
if (verbose) {
|
|
168
170
|
await logger.logToStderr(`Creating Microsoft Entra app registration...`);
|
|
169
171
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const longOptionRegex = /--([^\s]+)/;
|
|
2
|
+
const shortOptionRegex = /-([a-z])\b/;
|
|
3
|
+
export const optionsUtils = {
|
|
4
|
+
getUnknownOptions(options, knownOptions) {
|
|
5
|
+
const unknownOptions = JSON.parse(JSON.stringify(options));
|
|
6
|
+
// remove minimist catch-all option
|
|
7
|
+
delete unknownOptions._;
|
|
8
|
+
knownOptions.forEach(o => {
|
|
9
|
+
const longOptionName = longOptionRegex.exec(o.option)[1];
|
|
10
|
+
delete unknownOptions[longOptionName];
|
|
11
|
+
// short names are optional so we need to check if the current command has
|
|
12
|
+
// one before continuing
|
|
13
|
+
const shortOptionMatch = shortOptionRegex.exec(o.option);
|
|
14
|
+
if (shortOptionMatch) {
|
|
15
|
+
const shortOptionName = shortOptionMatch[1];
|
|
16
|
+
delete unknownOptions[shortOptionName];
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
return unknownOptions;
|
|
20
|
+
},
|
|
21
|
+
addUnknownOptionsToPayload(payload, unknownOptions) {
|
|
22
|
+
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
23
|
+
unknownOptionsNames.forEach(o => {
|
|
24
|
+
payload[o] = unknownOptions[o];
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=optionsUtils.js.map
|
package/dist/utils/spo.js
CHANGED
|
@@ -519,10 +519,11 @@ export const spo = {
|
|
|
519
519
|
},
|
|
520
520
|
/**
|
|
521
521
|
* Retrieves the spo user by email.
|
|
522
|
+
* Returns a user object
|
|
522
523
|
* @param webUrl Web url
|
|
523
524
|
* @param email The email of the user
|
|
524
525
|
* @param logger the Logger object
|
|
525
|
-
* @param verbose
|
|
526
|
+
* @param verbose Set for verbose logging
|
|
526
527
|
*/
|
|
527
528
|
async getUserByEmail(webUrl, email, logger, verbose) {
|
|
528
529
|
if (verbose && logger) {
|
|
@@ -593,10 +594,11 @@ export const spo = {
|
|
|
593
594
|
},
|
|
594
595
|
/**
|
|
595
596
|
* Retrieves the spo group by name.
|
|
597
|
+
* Returns a group object
|
|
596
598
|
* @param webUrl Web url
|
|
597
599
|
* @param name The name of the group
|
|
598
600
|
* @param logger the Logger object
|
|
599
|
-
* @param verbose
|
|
601
|
+
* @param verbose Set for verbose logging
|
|
600
602
|
*/
|
|
601
603
|
async getGroupByName(webUrl, name, logger, verbose) {
|
|
602
604
|
if (verbose && logger) {
|
|
@@ -615,10 +617,13 @@ export const spo = {
|
|
|
615
617
|
},
|
|
616
618
|
/**
|
|
617
619
|
* Retrieves the role definition by name.
|
|
620
|
+
* Returns a RoleDefinition object
|
|
621
|
+
* Returns a RoleDefinition object
|
|
618
622
|
* @param webUrl Web url
|
|
619
623
|
* @param name the name of the role definition
|
|
620
624
|
* @param logger the Logger object
|
|
621
|
-
* @param verbose
|
|
625
|
+
* @param verbose Set for verbose logging
|
|
626
|
+
* @param verbose Set for verbose logging
|
|
622
627
|
*/
|
|
623
628
|
async getRoleDefinitionByName(webUrl, name, logger, verbose) {
|
|
624
629
|
if (verbose && logger) {
|
|
@@ -1753,6 +1758,30 @@ export const spo = {
|
|
|
1753
1758
|
responseType: 'json'
|
|
1754
1759
|
};
|
|
1755
1760
|
return request.post(requestOptions);
|
|
1761
|
+
},
|
|
1762
|
+
/**
|
|
1763
|
+
* Get a role definition by name
|
|
1764
|
+
* Returns a RoleDefinition object
|
|
1765
|
+
* @param webUrl The web url
|
|
1766
|
+
* @param name the name of the role definition
|
|
1767
|
+
* @param logger The logger object
|
|
1768
|
+
* @param verbose Set for verbose logging
|
|
1769
|
+
*/
|
|
1770
|
+
async getRoleDefintionByName(webUrl, name, logger, verbose) {
|
|
1771
|
+
if (verbose && logger) {
|
|
1772
|
+
await logger.logToStderr(`Retrieving the role definition by name ${name}`);
|
|
1773
|
+
}
|
|
1774
|
+
const response = await odata.getAllItems(`${webUrl}/_api/web/roledefinitions`);
|
|
1775
|
+
const roleDefinition = response.find((role) => role.Name === name);
|
|
1776
|
+
if (!roleDefinition) {
|
|
1777
|
+
throw new Error(`The specified role definition name '${name}' does not exist.`);
|
|
1778
|
+
}
|
|
1779
|
+
const permissions = new BasePermissions();
|
|
1780
|
+
permissions.high = roleDefinition.BasePermissions.High;
|
|
1781
|
+
permissions.low = roleDefinition.BasePermissions.Low;
|
|
1782
|
+
roleDefinition.BasePermissionsValue = permissions.parse();
|
|
1783
|
+
roleDefinition.RoleTypeKindValue = RoleType[roleDefinition.RoleTypeKind];
|
|
1784
|
+
return roleDefinition;
|
|
1756
1785
|
}
|
|
1757
1786
|
};
|
|
1758
1787
|
//# sourceMappingURL=spo.js.map
|
|
@@ -38,16 +38,15 @@ m365 graph directoryextension get [options]
|
|
|
38
38
|
Get directory extension by id registered for an application specified by app id.
|
|
39
39
|
|
|
40
40
|
```sh
|
|
41
|
-
m365 directoryextension get --id 1f0f15e3-925d-40f0-8fc8-9d3ad135bce0 --appId fd918e4b-c821-4efb-b50a-5eddd23afc6f
|
|
41
|
+
m365 graph directoryextension get --id 1f0f15e3-925d-40f0-8fc8-9d3ad135bce0 --appId fd918e4b-c821-4efb-b50a-5eddd23afc6f
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Get directory extension by name registered for an application specified by name.
|
|
45
45
|
|
|
46
46
|
```sh
|
|
47
|
-
m365 directoryextension get --name extension_105be60b603845fea385e58772d9d630_GitHubWorkAccount --appName ContosoApp
|
|
47
|
+
m365 graph directoryextension get --name extension_105be60b603845fea385e58772d9d630_GitHubWorkAccount --appName ContosoApp
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
|
|
51
50
|
## Response
|
|
52
51
|
|
|
53
52
|
<Tabs>
|