@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
package/dist/Command.js
CHANGED
|
@@ -15,6 +15,7 @@ import { accessToken } from './utils/accessToken.js';
|
|
|
15
15
|
import { md } from './utils/md.js';
|
|
16
16
|
import { prompt } from './utils/prompt.js';
|
|
17
17
|
import { zod } from './utils/zod.js';
|
|
18
|
+
import { optionsUtils } from './utils/optionsUtils.js';
|
|
18
19
|
export class CommandError {
|
|
19
20
|
constructor(message, code) {
|
|
20
21
|
this.message = message;
|
|
@@ -337,39 +338,16 @@ class Command {
|
|
|
337
338
|
}
|
|
338
339
|
await telemetry.trackEvent(this.getUsedCommandName(), this.getTelemetryProperties(args));
|
|
339
340
|
}
|
|
340
|
-
getUnknownOptions(options) {
|
|
341
|
-
const unknownOptions = JSON.parse(JSON.stringify(options));
|
|
342
|
-
// remove minimist catch-all option
|
|
343
|
-
delete unknownOptions._;
|
|
344
|
-
const knownOptions = this.options;
|
|
345
|
-
const longOptionRegex = /--([^\s]+)/;
|
|
346
|
-
const shortOptionRegex = /-([a-z])\b/;
|
|
347
|
-
knownOptions.forEach(o => {
|
|
348
|
-
const longOptionName = longOptionRegex.exec(o.option)[1];
|
|
349
|
-
delete unknownOptions[longOptionName];
|
|
350
|
-
// short names are optional so we need to check if the current command has
|
|
351
|
-
// one before continuing
|
|
352
|
-
const shortOptionMatch = shortOptionRegex.exec(o.option);
|
|
353
|
-
if (shortOptionMatch) {
|
|
354
|
-
const shortOptionName = shortOptionMatch[1];
|
|
355
|
-
delete unknownOptions[shortOptionName];
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
return unknownOptions;
|
|
359
|
-
}
|
|
360
341
|
trackUnknownOptions(telemetryProps, options) {
|
|
361
|
-
const unknownOptions =
|
|
342
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
362
343
|
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
363
344
|
unknownOptionsNames.forEach(o => {
|
|
364
345
|
telemetryProps[o] = true;
|
|
365
346
|
});
|
|
366
347
|
}
|
|
367
348
|
addUnknownOptionsToPayload(payload, options) {
|
|
368
|
-
const unknownOptions =
|
|
369
|
-
|
|
370
|
-
unknownOptionsNames.forEach(o => {
|
|
371
|
-
payload[o] = unknownOptions[o];
|
|
372
|
-
});
|
|
349
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
350
|
+
optionsUtils.addUnknownOptionsToPayload(payload, unknownOptions);
|
|
373
351
|
}
|
|
374
352
|
loadValuesFromAccessToken(args) {
|
|
375
353
|
if (!auth.connection.accessTokens[auth.defaultResource]) {
|
package/dist/config.js
CHANGED
|
@@ -29,6 +29,7 @@ export default {
|
|
|
29
29
|
'https://graph.microsoft.com/OnlineMeetingArtifact.Read.All',
|
|
30
30
|
'https://graph.microsoft.com/OnlineMeetings.ReadWrite',
|
|
31
31
|
'https://graph.microsoft.com/OnlineMeetingTranscript.Read.All',
|
|
32
|
+
'https://graph.microsoft.com/Organization.ReadWrite.All',
|
|
32
33
|
'https://graph.microsoft.com/PeopleSettings.ReadWrite.All',
|
|
33
34
|
'https://graph.microsoft.com/Place.Read.All',
|
|
34
35
|
'https://graph.microsoft.com/Policy.Read.All',
|
|
@@ -7,6 +7,7 @@ var _AdaptiveCardSendCommand_instances, _AdaptiveCardSendCommand_initTelemetry,
|
|
|
7
7
|
import request from '../../../request.js';
|
|
8
8
|
import AnonymousCommand from '../../base/AnonymousCommand.js';
|
|
9
9
|
import commands from '../commands.js';
|
|
10
|
+
import { optionsUtils } from '../../../utils/optionsUtils.js';
|
|
10
11
|
class AdaptiveCardSendCommand extends AnonymousCommand {
|
|
11
12
|
get name() {
|
|
12
13
|
return commands.SEND;
|
|
@@ -26,7 +27,7 @@ class AdaptiveCardSendCommand extends AnonymousCommand {
|
|
|
26
27
|
return true;
|
|
27
28
|
}
|
|
28
29
|
async commandAction(logger, args) {
|
|
29
|
-
const unknownOptions =
|
|
30
|
+
const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
|
|
30
31
|
const unknownOptionNames = Object.getOwnPropertyNames(unknownOptions);
|
|
31
32
|
const card = await this.getCard(args, unknownOptionNames, unknownOptions);
|
|
32
33
|
const requestOptions = {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module';
|
|
2
2
|
import auth, { AuthType } from '../../Auth.js';
|
|
3
3
|
import Command, { CommandError } from '../../Command.js';
|
|
4
|
+
import { optionsUtils } from '../../utils/optionsUtils.js';
|
|
4
5
|
const require = createRequire(import.meta.url);
|
|
5
6
|
const csomDefs = require('../../../csom.json');
|
|
6
7
|
export default class SpoCommand extends Command {
|
|
@@ -70,7 +71,7 @@ export default class SpoCommand extends Command {
|
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
validateUnknownCsomOptions(options, csomObject, csomPropertyType) {
|
|
73
|
-
const unknownOptions =
|
|
74
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
74
75
|
const optionNames = Object.getOwnPropertyNames(unknownOptions);
|
|
75
76
|
if (optionNames.length === 0) {
|
|
76
77
|
return true;
|
|
@@ -36,11 +36,7 @@ class RequestCommand extends Command {
|
|
|
36
36
|
const url = this.resolveUrlTokens(args.options.url);
|
|
37
37
|
const method = (args.options.method || 'get').toUpperCase();
|
|
38
38
|
const headers = {};
|
|
39
|
-
|
|
40
|
-
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
41
|
-
unknownOptionsNames.forEach(o => {
|
|
42
|
-
headers[o] = unknownOptions[o];
|
|
43
|
-
});
|
|
39
|
+
this.addUnknownOptionsToPayload(headers, args.options);
|
|
44
40
|
if (!headers.accept) {
|
|
45
41
|
headers.accept = 'application/json';
|
|
46
42
|
}
|
|
@@ -105,19 +101,14 @@ class RequestCommand extends Command {
|
|
|
105
101
|
}
|
|
106
102
|
_RequestCommand_instances = new WeakSet(), _RequestCommand_initTelemetry = function _RequestCommand_initTelemetry() {
|
|
107
103
|
this.telemetry.push((args) => {
|
|
108
|
-
|
|
104
|
+
Object.assign(this.telemetryProperties, {
|
|
109
105
|
method: args.options.method || 'get',
|
|
110
106
|
resource: typeof args.options.resource !== 'undefined',
|
|
111
107
|
accept: args.options.accept || 'application/json',
|
|
112
108
|
body: typeof args.options.body !== 'undefined',
|
|
113
109
|
filePath: typeof args.options.filePath !== 'undefined'
|
|
114
|
-
};
|
|
115
|
-
const unknownOptions = this.getUnknownOptions(args.options);
|
|
116
|
-
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
117
|
-
unknownOptionsNames.forEach(o => {
|
|
118
|
-
properties[o] = typeof unknownOptions[o] !== 'undefined';
|
|
119
110
|
});
|
|
120
|
-
|
|
111
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
121
112
|
});
|
|
122
113
|
}, _RequestCommand_initOptions = function _RequestCommand_initOptions() {
|
|
123
114
|
this.options.unshift({
|
|
@@ -18,6 +18,7 @@ import { validation } from '../../utils/validation.js';
|
|
|
18
18
|
import AnonymousCommand from '../base/AnonymousCommand.js';
|
|
19
19
|
import commands from './commands.js';
|
|
20
20
|
import { interactivePreset, powerShellPreset, scriptingPreset } from './setupPresets.js';
|
|
21
|
+
import { optionsUtils } from '../../utils/optionsUtils.js';
|
|
21
22
|
export var CliUsageMode;
|
|
22
23
|
(function (CliUsageMode) {
|
|
23
24
|
CliUsageMode["Interactively"] = "interactively";
|
|
@@ -227,6 +228,7 @@ class SetupCommand extends AnonymousCommand {
|
|
|
227
228
|
});
|
|
228
229
|
const appInfo = await entraApp.createAppRegistration({
|
|
229
230
|
options,
|
|
231
|
+
unknownOptions: optionsUtils.getUnknownOptions(options, this.options),
|
|
230
232
|
apis,
|
|
231
233
|
logger,
|
|
232
234
|
verbose: this.verbose,
|
|
@@ -14,6 +14,9 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
|
|
|
14
14
|
get description() {
|
|
15
15
|
return 'Creates an administrative unit';
|
|
16
16
|
}
|
|
17
|
+
allowUnknownOptions() {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
17
20
|
constructor() {
|
|
18
21
|
super();
|
|
19
22
|
_EntraAdministrativeUnitAddCommand_instances.add(this);
|
|
@@ -21,17 +24,19 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
|
|
|
21
24
|
__classPrivateFieldGet(this, _EntraAdministrativeUnitAddCommand_instances, "m", _EntraAdministrativeUnitAddCommand_initOptions).call(this);
|
|
22
25
|
}
|
|
23
26
|
async commandAction(logger, args) {
|
|
27
|
+
const requestBody = {
|
|
28
|
+
description: args.options.description,
|
|
29
|
+
displayName: args.options.displayName,
|
|
30
|
+
visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
|
|
31
|
+
};
|
|
32
|
+
this.addUnknownOptionsToPayload(requestBody, args.options);
|
|
24
33
|
const requestOptions = {
|
|
25
34
|
url: `${this.resource}/v1.0/directory/administrativeUnits`,
|
|
26
35
|
headers: {
|
|
27
36
|
accept: 'application/json;odata.metadata=none'
|
|
28
37
|
},
|
|
29
38
|
responseType: 'json',
|
|
30
|
-
data:
|
|
31
|
-
description: args.options.description,
|
|
32
|
-
displayName: args.options.displayName,
|
|
33
|
-
visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
|
|
34
|
-
}
|
|
39
|
+
data: requestBody
|
|
35
40
|
};
|
|
36
41
|
try {
|
|
37
42
|
const administrativeUnit = await request.post(requestOptions);
|
|
@@ -12,6 +12,7 @@ import { accessToken } from '../../../../utils/accessToken.js';
|
|
|
12
12
|
import { entraApp } from '../../../../utils/entraApp.js';
|
|
13
13
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
14
14
|
import commands from '../../commands.js';
|
|
15
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
15
16
|
class EntraAppAddCommand extends GraphCommand {
|
|
16
17
|
get name() {
|
|
17
18
|
return commands.APP_ADD;
|
|
@@ -19,6 +20,9 @@ class EntraAppAddCommand extends GraphCommand {
|
|
|
19
20
|
get description() {
|
|
20
21
|
return 'Creates new Entra app registration';
|
|
21
22
|
}
|
|
23
|
+
allowUnknownOptions() {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
22
26
|
constructor() {
|
|
23
27
|
super();
|
|
24
28
|
_EntraAppAddCommand_instances.add(this);
|
|
@@ -43,6 +47,7 @@ class EntraAppAddCommand extends GraphCommand {
|
|
|
43
47
|
});
|
|
44
48
|
let appInfo = await entraApp.createAppRegistration({
|
|
45
49
|
options: args.options,
|
|
50
|
+
unknownOptions: optionsUtils.getUnknownOptions(args.options, this.options),
|
|
46
51
|
apis,
|
|
47
52
|
logger,
|
|
48
53
|
verbose: this.verbose,
|
|
@@ -10,6 +10,7 @@ import { formatting } from '../../../../utils/formatting.js';
|
|
|
10
10
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
11
11
|
import commands from '../../commands.js';
|
|
12
12
|
import { cli } from '../../../../cli/cli.js';
|
|
13
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
13
14
|
class EntraAppSetCommand extends GraphCommand {
|
|
14
15
|
get name() {
|
|
15
16
|
return commands.APP_SET;
|
|
@@ -17,6 +18,9 @@ class EntraAppSetCommand extends GraphCommand {
|
|
|
17
18
|
get description() {
|
|
18
19
|
return 'Updates Entra app registration';
|
|
19
20
|
}
|
|
21
|
+
allowUnknownOptions() {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
20
24
|
constructor() {
|
|
21
25
|
super();
|
|
22
26
|
_EntraAppSetCommand_instances.add(this);
|
|
@@ -29,6 +33,7 @@ class EntraAppSetCommand extends GraphCommand {
|
|
|
29
33
|
async commandAction(logger, args) {
|
|
30
34
|
try {
|
|
31
35
|
let objectId = await this.getAppObjectId(args, logger);
|
|
36
|
+
objectId = await this.updateUnknownOptions(args, objectId);
|
|
32
37
|
objectId = await this.configureUri(args, objectId, logger);
|
|
33
38
|
objectId = await this.configureRedirectUris(args, objectId, logger);
|
|
34
39
|
objectId = await this.updateAllowPublicClientFlows(args, objectId, logger);
|
|
@@ -68,6 +73,23 @@ class EntraAppSetCommand extends GraphCommand {
|
|
|
68
73
|
const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registration with name '${name}' found.`, resultAsKeyValuePair);
|
|
69
74
|
return result.id;
|
|
70
75
|
}
|
|
76
|
+
async updateUnknownOptions(args, objectId) {
|
|
77
|
+
const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
|
|
78
|
+
if (Object.keys(unknownOptions).length > 0) {
|
|
79
|
+
const requestBody = {};
|
|
80
|
+
optionsUtils.addUnknownOptionsToPayload(requestBody, unknownOptions);
|
|
81
|
+
const requestOptions = {
|
|
82
|
+
url: `${this.resource}/v1.0/myorganization/applications/${objectId}`,
|
|
83
|
+
headers: {
|
|
84
|
+
'content-type': 'application/json;odata.metadata=none'
|
|
85
|
+
},
|
|
86
|
+
responseType: 'json',
|
|
87
|
+
data: requestBody
|
|
88
|
+
};
|
|
89
|
+
await request.patch(requestOptions);
|
|
90
|
+
}
|
|
91
|
+
return objectId;
|
|
92
|
+
}
|
|
71
93
|
async updateAllowPublicClientFlows(args, objectId, logger) {
|
|
72
94
|
if (args.options.allowPublicClientFlows === undefined) {
|
|
73
95
|
return objectId;
|
|
@@ -270,6 +292,7 @@ _a = EntraAppSetCommand, _EntraAppSetCommand_instances = new WeakSet(), _EntraAp
|
|
|
270
292
|
certificateDisplayName: typeof args.options.certificateDisplayName !== 'undefined',
|
|
271
293
|
allowPublicClientFlows: typeof args.options.allowPublicClientFlows !== 'undefined'
|
|
272
294
|
});
|
|
295
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
273
296
|
});
|
|
274
297
|
}, _EntraAppSetCommand_initOptions = function _EntraAppSetCommand_initOptions() {
|
|
275
298
|
this.options.unshift({ option: '--appId [appId]' }, { option: '--objectId [objectId]' }, { option: '-n, --name [name]' }, { option: '-u, --uris [uris]' }, { option: '-r, --redirectUris [redirectUris]' }, { option: '--certificateFile [certificateFile]' }, { option: '--certificateBase64Encoded [certificateBase64Encoded]' }, { option: '--certificateDisplayName [certificateDisplayName]' }, {
|
|
@@ -212,6 +212,7 @@ _EntraGroupAddCommand_instances = new WeakSet(), _EntraGroupAddCommand_initOptio
|
|
|
212
212
|
memberUserNames: typeof args.options.memberUserNames !== 'undefined',
|
|
213
213
|
visibility: typeof args.options.visibility !== 'undefined'
|
|
214
214
|
});
|
|
215
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
215
216
|
});
|
|
216
217
|
};
|
|
217
218
|
export default new EntraGroupAddCommand();
|
|
@@ -19,6 +19,9 @@ class EntraGroupSetCommand extends GraphCommand {
|
|
|
19
19
|
get description() {
|
|
20
20
|
return 'Updates a Microsoft Entra group';
|
|
21
21
|
}
|
|
22
|
+
allowUnknownOptions() {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
22
25
|
constructor() {
|
|
23
26
|
super();
|
|
24
27
|
_EntraGroupSetCommand_instances.add(this);
|
|
@@ -38,17 +41,19 @@ class EntraGroupSetCommand extends GraphCommand {
|
|
|
38
41
|
}
|
|
39
42
|
groupId = await entraGroup.getGroupIdByDisplayName(args.options.displayName);
|
|
40
43
|
}
|
|
44
|
+
const requestBody = {
|
|
45
|
+
displayName: args.options.newDisplayName,
|
|
46
|
+
description: args.options.description === '' ? null : args.options.description,
|
|
47
|
+
mailNickName: args.options.mailNickname,
|
|
48
|
+
visibility: args.options.visibility
|
|
49
|
+
};
|
|
50
|
+
this.addUnknownOptionsToPayload(requestBody, args.options);
|
|
41
51
|
const requestOptions = {
|
|
42
52
|
url: `${this.resource}/v1.0/groups/${groupId}`,
|
|
43
53
|
headers: {
|
|
44
54
|
accept: 'application/json;odata.metadata=none'
|
|
45
55
|
},
|
|
46
|
-
data:
|
|
47
|
-
displayName: args.options.newDisplayName,
|
|
48
|
-
description: args.options.description === '' ? null : args.options.description,
|
|
49
|
-
mailNickName: args.options.mailNickname,
|
|
50
|
-
visibility: args.options.visibility
|
|
51
|
-
}
|
|
56
|
+
data: requestBody
|
|
52
57
|
};
|
|
53
58
|
await request.patch(requestOptions);
|
|
54
59
|
const ownerIds = await this.getUserIds(logger, args.options.ownerIds, args.options.ownerUserNames);
|
|
@@ -167,6 +172,7 @@ _EntraGroupSetCommand_instances = new WeakSet(), _EntraGroupSetCommand_initTelem
|
|
|
167
172
|
memberUserNames: typeof args.options.memberUserNames !== 'undefined',
|
|
168
173
|
visibility: typeof args.options.visibility !== 'undefined'
|
|
169
174
|
});
|
|
175
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
170
176
|
});
|
|
171
177
|
}, _EntraGroupSetCommand_initOptions = function _EntraGroupSetCommand_initOptions() {
|
|
172
178
|
this.options.unshift({
|
|
@@ -131,6 +131,7 @@ _EntraUserAddCommand_instances = new WeakSet(), _EntraUserAddCommand_initTelemet
|
|
|
131
131
|
managerUserId: typeof args.options.managerUserId !== 'undefined',
|
|
132
132
|
managerUserName: typeof args.options.managerUserName !== 'undefined'
|
|
133
133
|
});
|
|
134
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
134
135
|
});
|
|
135
136
|
}, _EntraUserAddCommand_initOptions = function _EntraUserAddCommand_initOptions() {
|
|
136
137
|
this.options.unshift({
|
|
@@ -8,6 +8,7 @@ import { formatting } from '../../../../utils/formatting.js';
|
|
|
8
8
|
import { odata } from '../../../../utils/odata.js';
|
|
9
9
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
10
10
|
import commands from '../../commands.js';
|
|
11
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
11
12
|
class EntraUserListCommand extends GraphCommand {
|
|
12
13
|
get name() {
|
|
13
14
|
return commands.USER_LIST;
|
|
@@ -56,7 +57,7 @@ class EntraUserListCommand extends GraphCommand {
|
|
|
56
57
|
}
|
|
57
58
|
getFilter(options) {
|
|
58
59
|
const filters = [];
|
|
59
|
-
const unknownOptions =
|
|
60
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
60
61
|
Object.keys(unknownOptions).forEach(key => {
|
|
61
62
|
if (typeof options[key] === 'boolean') {
|
|
62
63
|
throw `Specify value for the ${key} property`;
|
|
@@ -47,7 +47,7 @@ class ExternalItemAddCommand extends GraphCommand {
|
|
|
47
47
|
// we need to rewrite the @odata properties to the correct format
|
|
48
48
|
// to extract multiple values for collections into arrays
|
|
49
49
|
this.rewriteCollectionProperties(args.options);
|
|
50
|
-
this.addUnknownOptionsToPayload(requestBody
|
|
50
|
+
this.addUnknownOptionsToPayload(requestBody, args.options);
|
|
51
51
|
const requestOptions = {
|
|
52
52
|
url: `${this.resource}/v1.0/external/connections/${args.options.externalConnectionId}/items/${args.options.id}`,
|
|
53
53
|
headers: {
|
|
@@ -96,6 +96,7 @@ _a = ExternalItemAddCommand, _ExternalItemAddCommand_instances = new WeakSet(),
|
|
|
96
96
|
Object.assign(this.telemetryProperties, {
|
|
97
97
|
contentType: typeof args.options.contentType
|
|
98
98
|
});
|
|
99
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
99
100
|
});
|
|
100
101
|
}, _ExternalItemAddCommand_initOptions = function _ExternalItemAddCommand_initOptions() {
|
|
101
102
|
this.options.unshift({
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { globalOptionsZod } from '../../../../Command.js';
|
|
3
|
+
import { zod } from '../../../../utils/zod.js';
|
|
4
|
+
import { validation } from '../../../../utils/validation.js';
|
|
5
|
+
import GraphCommand from '../../../base/GraphCommand.js';
|
|
6
|
+
import commands from '../../commands.js';
|
|
7
|
+
import request from '../../../../request.js';
|
|
8
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
9
|
+
const options = globalOptionsZod
|
|
10
|
+
.extend({
|
|
11
|
+
name: zod.alias('n', z.string()),
|
|
12
|
+
resourceId: zod.alias('i', z.string()),
|
|
13
|
+
resourceType: zod.alias('t', z.enum(['user', 'group', 'device', 'organization']))
|
|
14
|
+
})
|
|
15
|
+
.and(z.any());
|
|
16
|
+
class GraphOpenExtensionAddCommand extends GraphCommand {
|
|
17
|
+
get name() {
|
|
18
|
+
return commands.OPENEXTENSION_ADD;
|
|
19
|
+
}
|
|
20
|
+
get description() {
|
|
21
|
+
return 'Adds an open extension to a resource';
|
|
22
|
+
}
|
|
23
|
+
get schema() {
|
|
24
|
+
return options;
|
|
25
|
+
}
|
|
26
|
+
getRefinedSchema(schema) {
|
|
27
|
+
return schema
|
|
28
|
+
.refine(options => options.resourceType !== 'group' && options.resourceType !== 'device' && options.resourceType !== 'organization' || (options.resourceId && validation.isValidGuid(options.resourceId)), options => ({
|
|
29
|
+
message: `The '${options.resourceId}' must be a valid GUID`,
|
|
30
|
+
path: ['resourceId']
|
|
31
|
+
}))
|
|
32
|
+
.refine(options => options.resourceType !== 'user' || (options.resourceId && (validation.isValidGuid(options.resourceId) || validation.isValidUserPrincipalName(options.resourceId))), options => ({
|
|
33
|
+
message: `The '${options.resourceId}' must be a valid GUID or user principal name`,
|
|
34
|
+
path: ['resourceId']
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
async commandAction(logger, args) {
|
|
38
|
+
try {
|
|
39
|
+
const requestBody = {};
|
|
40
|
+
requestBody["extensionName"] = args.options.name;
|
|
41
|
+
const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
|
|
42
|
+
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
43
|
+
unknownOptionsNames.forEach(async (o) => {
|
|
44
|
+
try {
|
|
45
|
+
const jsonObject = JSON.parse(unknownOptions[o]);
|
|
46
|
+
requestBody[o] = jsonObject;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
requestBody[o] = unknownOptions[o];
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const requestOptions = {
|
|
53
|
+
url: `${this.resource}/v1.0/${args.options.resourceType}${args.options.resourceType === 'organization' ? '' : 's'}/${args.options.resourceId}/extensions`,
|
|
54
|
+
headers: {
|
|
55
|
+
accept: 'application/json;odata.metadata=none',
|
|
56
|
+
'content-type': 'application/json'
|
|
57
|
+
},
|
|
58
|
+
data: requestBody,
|
|
59
|
+
responseType: 'json'
|
|
60
|
+
};
|
|
61
|
+
if (args.options.verbose) {
|
|
62
|
+
await logger.logToStderr(`Adding open extension to the ${args.options.resourceType} with id '${args.options.resourceId}'...`);
|
|
63
|
+
}
|
|
64
|
+
const res = await request.post(requestOptions);
|
|
65
|
+
await logger.log(res);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
this.handleRejectedODataJsonPromise(err);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export default new GraphOpenExtensionAddCommand();
|
|
73
|
+
//# sourceMappingURL=openextension-add.js.map
|
|
@@ -4,6 +4,7 @@ export default {
|
|
|
4
4
|
DIRECTORYEXTENSION_ADD: `${prefix} directoryextension add`,
|
|
5
5
|
DIRECTORYEXTENSION_GET: `${prefix} directoryextension get`,
|
|
6
6
|
DIRECTORYEXTENSION_REMOVE: `${prefix} directoryextension remove`,
|
|
7
|
+
OPENEXTENSION_ADD: `${prefix} openextension add`,
|
|
7
8
|
SCHEMAEXTENSION_ADD: `${prefix} schemaextension add`,
|
|
8
9
|
SCHEMAEXTENSION_GET: `${prefix} schemaextension get`,
|
|
9
10
|
SCHEMAEXTENSION_LIST: `${prefix} schemaextension list`,
|
|
@@ -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 _SpoFolderRoleAssignmentAddCommand_instances, _SpoFolderRoleAssignmentAddCommand_initTelemetry, _SpoFolderRoleAssignmentAddCommand_initOptions, _SpoFolderRoleAssignmentAddCommand_initValidators, _SpoFolderRoleAssignmentAddCommand_initTypes;
|
|
7
|
-
import { cli } from '../../../../cli/cli.js';
|
|
8
7
|
import request from '../../../../request.js';
|
|
9
8
|
import { formatting } from '../../../../utils/formatting.js';
|
|
10
9
|
import { urlUtil } from '../../../../utils/urlUtil.js';
|
|
11
10
|
import { validation } from '../../../../utils/validation.js';
|
|
12
11
|
import SpoCommand from '../../../base/SpoCommand.js';
|
|
13
12
|
import commands from '../../commands.js';
|
|
14
|
-
import spoGroupGetCommand from '../group/group-get.js';
|
|
15
|
-
import spoRoleDefinitionFolderCommand from '../roledefinition/roledefinition-list.js';
|
|
16
|
-
import spoUserGetCommand from '../user/user-get.js';
|
|
17
13
|
import { entraGroup } from '../../../../utils/entraGroup.js';
|
|
18
14
|
import { spo } from '../../../../utils/spo.js';
|
|
19
15
|
class SpoFolderRoleAssignmentAddCommand extends SpoCommand {
|
|
@@ -38,7 +34,6 @@ class SpoFolderRoleAssignmentAddCommand extends SpoCommand {
|
|
|
38
34
|
const serverRelativeUrl = urlUtil.getServerRelativePath(args.options.webUrl, args.options.folderUrl);
|
|
39
35
|
const roleFolderUrl = urlUtil.getWebRelativePath(args.options.webUrl, args.options.folderUrl);
|
|
40
36
|
try {
|
|
41
|
-
//await this.getFolderUrl(args.options);
|
|
42
37
|
let requestUrl = `${args.options.webUrl}/_api/web/`;
|
|
43
38
|
if (roleFolderUrl.split('/').length === 2) {
|
|
44
39
|
requestUrl += `GetList('${formatting.encodeQueryParameter(serverRelativeUrl)}')`;
|
|
@@ -46,13 +41,13 @@ class SpoFolderRoleAssignmentAddCommand extends SpoCommand {
|
|
|
46
41
|
else {
|
|
47
42
|
requestUrl += `GetFolderByServerRelativePath(DecodedUrl='${formatting.encodeQueryParameter(serverRelativeUrl)}')/ListItemAllFields`;
|
|
48
43
|
}
|
|
49
|
-
const roleDefinitionId = await this.getRoleDefinitionId(args.options);
|
|
44
|
+
const roleDefinitionId = await this.getRoleDefinitionId(args.options, logger);
|
|
50
45
|
let principalId = args.options.principalId;
|
|
51
46
|
if (args.options.upn) {
|
|
52
|
-
principalId = await this.getUserPrincipalId(args.options);
|
|
47
|
+
principalId = await this.getUserPrincipalId(args.options, logger);
|
|
53
48
|
}
|
|
54
49
|
else if (args.options.groupName) {
|
|
55
|
-
principalId = await this.getGroupPrincipalId(args.options);
|
|
50
|
+
principalId = await this.getGroupPrincipalId(args.options, logger);
|
|
56
51
|
}
|
|
57
52
|
else if (args.options.entraGroupId || args.options.entraGroupName) {
|
|
58
53
|
if (this.verbose) {
|
|
@@ -82,50 +77,20 @@ class SpoFolderRoleAssignmentAddCommand extends SpoCommand {
|
|
|
82
77
|
};
|
|
83
78
|
return request.post(requestOptions);
|
|
84
79
|
}
|
|
85
|
-
async getRoleDefinitionId(options) {
|
|
80
|
+
async getRoleDefinitionId(options, logger) {
|
|
86
81
|
if (!options.roleDefinitionName) {
|
|
87
82
|
return options.roleDefinitionId;
|
|
88
83
|
}
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
output: 'json',
|
|
92
|
-
debug: this.debug,
|
|
93
|
-
verbose: this.verbose
|
|
94
|
-
};
|
|
95
|
-
const output = await cli.executeCommandWithOutput(spoRoleDefinitionFolderCommand, { options: { ...roleDefinitionFolderCommandOptions, _: [] } });
|
|
96
|
-
const getRoleDefinitionFolderOutput = JSON.parse(output.stdout);
|
|
97
|
-
const roleDefinition = getRoleDefinitionFolderOutput.find((role) => role.Name === options.roleDefinitionName);
|
|
98
|
-
if (roleDefinition) {
|
|
99
|
-
return roleDefinition.Id;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
throw Error(`The specified role definition name '${options.roleDefinitionName}' does not exist.`);
|
|
103
|
-
}
|
|
84
|
+
const roleDefintion = await spo.getRoleDefintionByName(options.webUrl, options.roleDefinitionName, logger, this.verbose);
|
|
85
|
+
return roleDefintion.Id;
|
|
104
86
|
}
|
|
105
|
-
async getGroupPrincipalId(options) {
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
name: options.groupName,
|
|
109
|
-
output: 'json',
|
|
110
|
-
debug: this.debug,
|
|
111
|
-
verbose: this.verbose
|
|
112
|
-
};
|
|
113
|
-
const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
|
|
114
|
-
const getGroupOutput = JSON.parse(output.stdout);
|
|
115
|
-
return getGroupOutput.Id;
|
|
87
|
+
async getGroupPrincipalId(options, logger) {
|
|
88
|
+
const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
|
|
89
|
+
return group.Id;
|
|
116
90
|
}
|
|
117
|
-
async getUserPrincipalId(options) {
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
email: options.upn,
|
|
121
|
-
id: undefined,
|
|
122
|
-
output: 'json',
|
|
123
|
-
debug: this.debug,
|
|
124
|
-
verbose: this.verbose
|
|
125
|
-
};
|
|
126
|
-
const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
|
|
127
|
-
const getUserOutput = JSON.parse(output.stdout);
|
|
128
|
-
return getUserOutput.Id;
|
|
91
|
+
async getUserPrincipalId(options, logger) {
|
|
92
|
+
const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
|
|
93
|
+
return user.Id;
|
|
129
94
|
}
|
|
130
95
|
}
|
|
131
96
|
_SpoFolderRoleAssignmentAddCommand_instances = new WeakSet(), _SpoFolderRoleAssignmentAddCommand_initTelemetry = function _SpoFolderRoleAssignmentAddCommand_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 SpoFolderRoleAssignmentRemoveCommand extends SpoCommand {
|
|
@@ -38,11 +36,12 @@ class SpoFolderRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
38
36
|
const serverRelativeUrl = urlUtil.getServerRelativePath(args.options.webUrl, args.options.folderUrl);
|
|
39
37
|
const requestUrl = `${args.options.webUrl}/_api/web/GetFolderByServerRelativePath(DecodedUrl='${formatting.encodeQueryParameter(serverRelativeUrl)}')/ListItemAllFields`;
|
|
40
38
|
try {
|
|
39
|
+
let principalId = args.options.principalId;
|
|
41
40
|
if (args.options.upn) {
|
|
42
|
-
|
|
41
|
+
principalId = await this.getUserPrincipalId(args.options, logger);
|
|
43
42
|
}
|
|
44
43
|
else if (args.options.groupName) {
|
|
45
|
-
|
|
44
|
+
principalId = await this.getGroupPrincipalId(args.options, logger);
|
|
46
45
|
}
|
|
47
46
|
else if (args.options.entraGroupId || args.options.entraGroupName) {
|
|
48
47
|
if (this.verbose) {
|
|
@@ -52,9 +51,9 @@ class SpoFolderRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
52
51
|
? await entraGroup.getGroupById(args.options.entraGroupId)
|
|
53
52
|
: await entraGroup.getGroupByDisplayName(args.options.entraGroupName);
|
|
54
53
|
const siteUser = await spo.ensureEntraGroup(args.options.webUrl, group);
|
|
55
|
-
|
|
54
|
+
principalId = siteUser.Id;
|
|
56
55
|
}
|
|
57
|
-
await this.removeRoleAssignment(requestUrl,
|
|
56
|
+
await this.removeRoleAssignment(requestUrl, principalId);
|
|
58
57
|
}
|
|
59
58
|
catch (err) {
|
|
60
59
|
this.handleRejectedODataJsonPromise(err);
|
|
@@ -70,9 +69,9 @@ class SpoFolderRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
70
69
|
}
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
|
-
async removeRoleAssignment(requestUrl,
|
|
72
|
+
async removeRoleAssignment(requestUrl, principalId) {
|
|
74
73
|
const requestOptions = {
|
|
75
|
-
url: `${requestUrl}/roleassignments/removeroleassignment(principalid='${
|
|
74
|
+
url: `${requestUrl}/roleassignments/removeroleassignment(principalid='${principalId}')`,
|
|
76
75
|
method: 'POST',
|
|
77
76
|
headers: {
|
|
78
77
|
'accept': 'application/json;odata=nometadata',
|
|
@@ -82,30 +81,13 @@ class SpoFolderRoleAssignmentRemoveCommand extends SpoCommand {
|
|
|
82
81
|
};
|
|
83
82
|
return request.post(requestOptions);
|
|
84
83
|
}
|
|
85
|
-
async getGroupPrincipalId(options) {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
name: options.groupName,
|
|
89
|
-
output: 'json',
|
|
90
|
-
debug: this.debug,
|
|
91
|
-
verbose: this.verbose
|
|
92
|
-
};
|
|
93
|
-
const output = await cli.executeCommandWithOutput(spoGroupGetCommand, { options: { ...groupGetCommandOptions, _: [] } });
|
|
94
|
-
const getGroupOutput = JSON.parse(output.stdout);
|
|
95
|
-
return getGroupOutput.Id;
|
|
84
|
+
async getGroupPrincipalId(options, logger) {
|
|
85
|
+
const group = await spo.getGroupByName(options.webUrl, options.groupName, logger, this.verbose);
|
|
86
|
+
return group.Id;
|
|
96
87
|
}
|
|
97
|
-
async getUserPrincipalId(options) {
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
email: options.upn,
|
|
101
|
-
id: undefined,
|
|
102
|
-
output: 'json',
|
|
103
|
-
debug: this.debug,
|
|
104
|
-
verbose: this.verbose
|
|
105
|
-
};
|
|
106
|
-
const output = await cli.executeCommandWithOutput(spoUserGetCommand, { options: { ...userGetCommandOptions, _: [] } });
|
|
107
|
-
const getUserOutput = JSON.parse(output.stdout);
|
|
108
|
-
return getUserOutput.Id;
|
|
88
|
+
async getUserPrincipalId(options, logger) {
|
|
89
|
+
const user = await spo.getUserByEmail(options.webUrl, options.upn, logger, this.verbose);
|
|
90
|
+
return user.Id;
|
|
109
91
|
}
|
|
110
92
|
}
|
|
111
93
|
_SpoFolderRoleAssignmentRemoveCommand_instances = new WeakSet(), _SpoFolderRoleAssignmentRemoveCommand_initTelemetry = function _SpoFolderRoleAssignmentRemoveCommand_initTelemetry() {
|