@pnp/cli-microsoft365 10.6.0-beta.36bb898 → 10.6.0-beta.55e3c97
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/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/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`,
|
|
@@ -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
|
|
@@ -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>
|